我学会了一些超载新/删除“C++入门”。但我很好奇:作为默认新/删除是那么好,我应该什么时候超载呢?我什么时候应该重载new /删除C++
2
A
回答
3
只有当您的班级有特定的内存需求时,才应该重载它们。例如,如果要确保Foo
的所有实例都分配出内存池。
除了这种事情,很少需要超载它们。
1
另外如果您创建一个自定义分配库,如TCMalloc,并且您希望程序中的所有分配从new
都转到您的库。
1
关于Facebook's FBVector类型的愚蠢库中有一个有趣的文档,这解释了为什么他们使用自定义分配器来处理向量,特别是它允许就地重新分配,优化增长因子以避免gcc的分配爬行等等。
一般情况下,这是一个坏主意,做自己分配,因为它有很多的权衡决策,使一个复杂的问题。
1
一些用例浮现在脑海:
- 跟踪内存分配和释放,为@Joachim Pileborg说。等工具的valgrind或地址消毒剂能为你做,但做自己允许只指定分配的一个子集,因此对表演
- 使用自定义分配机制的影响较小,例如生产对齐地址(SSE,或其他硬件的要求),或分配共享内存中,或使用一个内存池,或在特定的地址分配的底层驱动程序需要
- 使用不同的分配算法比你的编译器/标准库提供的一个。根据您的分配和线程模式,选择适当的分配策略可能会提高性能。
2
在课堂上,超载他们的通常原因是使用 内存池。这通常只对非常小的类很有用,其中 将被动态分配;例如图中的节点,例如 示例,其中池分配器可以显着提高地点和分配/解除分配速度。
您也可以重载全局new和delete操作使用特殊 分配器(比如从内存中的特定区域分配)。然而,这可能是 棘手,因为无法在删除表达式中指定附加的 参数。实事求是地讲,当你做 这一点,你也必须更换非安置new和delete 运营商,并安排新的运营商以某种方式保存必要的 信息来找到正确的删除器。
,当然还有,虽然没有超载,可以取代全球新 和delete操作符,与被仪表收集有关分配和删除 信息的,用于调试 目的(或因为你有一些自定义布局新/删除)。
您应该不是做什么与全局新/删除在库中。 由于您所做的任何事情都需要替换非放置表单,因此在库中执行此操作会有风险冲突(如果用户还需要在其主应用程序中执行 )。
相关问题
- 1. 你什么时候重载operator new?
- 2. 什么时候应该删除旧页面后.htaccess重定向
- 3. 我们什么时候应该上课,什么时候不应该上课
- 4. 什么时候应该重写toString()?
- 5. 为什么我们应该重载/覆盖新的和删除?
- 6. C++重载运算符new删除,
- 7. 什么时候应该实时使用方法重载项目?
- 8. 我什么时候应该使用javax.swing.SwingUtilities.invokeLater()?
- 9. 我什么时候应该使用UITableViewCellSeparatorStyleSingleLineEtched?
- 10. 我应该什么时候生产?
- 11. 我应该什么时候回来?
- 12. GitHub:我应该什么时候做叉?
- 13. 什么时候应该使用String s = new String(“Hello World”)?
- 14. 什么时候应该使用async/await,什么时候不用?
- 15. 什么时候应该使用模板和重载函数?
- 16. 什么时候应该使用非成员运算符重载?
- 17. 什么时候应该使用sed,什么时候应该使用awk
- 18. 什么时候删除模板实例更适合删除非模板重载?
- 19. 什么时候应该使用geom_map?
- 20. 什么时候应该关闭EntityManagerFactory?
- 21. 什么时候应该扩展NSDocument,什么时候应该扩展NSWindowController?
- 22. 什么时候应该使用memcpy,什么时候应该使用memmove?
- 23. 什么时候应该使用Import-Package,什么时候应该使用Require-Bundle?
- 24. 什么时候应该使用AWS,什么时候不使用
- 25. 什么时候应该使用html5 sessionStorage?
- 26. Z3/SMT:我应该什么时候推/推重置?
- 27. 我什么时候应该重写等方法在Java中
- 28. 我们应该什么时候在C#中使用事件
- 29. C#:我应该什么时候使用TryParse?
- 30. 我应该什么时候宣布“抛出”,什么时候不抛出?
我有时会用它来重载它们以添加跟踪到内存分配,所以我可以知道分配内存块的时间和位置,作为一种调试帮助。 –
优化的第一条规则:*测量,优化,测量*主题上的反响:只有当*证明*确实有必要时才重载新/删除。 *然后*证明你没有认为更糟。 ;) – DevSolar
@JoachimPileborg严格地说,这不是超载,而是更换。 (然而,这可能是OP想到的那种事情。) –