我什么时候应该在C ++中重载new / delete

时间:2012-10-12 08:57:39

标签: c++

我在“C ++ Primer”中学到了一些关于重载new / delete的东西。但我很好奇:因为默认的new / delete非常好,我什么时候应该重载它们?

5 个答案:

答案 0 :(得分:3)

当你的班级有特定的内存要求时,你应该只重载它们。例如,如果要确保从内存池中分配Foo的所有实例。

除了这种事情之外,很少需要超载它们。

答案 1 :(得分:2)

在课程级别,重载它们的通常原因是使用a 内存池。这通常仅适用于非常小的类 会动态分配很多;像图中的节点之类的东西 例如,池分配器可以显着改善位置和 分配/解除分配速度。

您还可以重载全局new和delete运算符以使用special 分配器(比如从内存中的特定区域分配)。这可以 然而,棘手,因为没有办法指定额外的 删除表达式中的参数。实际上,当你这样做时 这个,你还必须替换非放置新的和删除 运营商,并安排新的运营商以某种方式存储 找到正确删除者所需的信息。

当然,虽然不会超载,但您可以替换全局新内容 并删除运算符,以及用于收集的工具 有关分配和删除的信息,用于调试 目的(或因为您有一些自定义展示位置新/删除)。

你应该对库中的全局新/删除做任何事情。 由于您所做的任何事情都需要更换非放置表格, 在库中执行此操作会带来冲突(如果用户也需要这样做) 它在他的主要申请中。)

答案 2 :(得分:1)

此外,如果您创建自定义分配库,例如TCMalloc,并且您希望程序中new的所有分配都转到您的库中。

答案 3 :(得分:1)

在他们的愚蠢库中有一个关于Facebook's FBVector类型的有趣文档,它解释了为什么他们为向量使用自定义分配器,特别是它允许就地重新分配,优化增长因子以避免gcc的分配爬行,以及等等。

一般来说,自己做分配是一个坏主意,因为这是一个复杂的问题,需要做出很多权衡决定。

答案 4 :(得分:1)

我想到的一些用例:

  • 追踪内存分配和解除分配,正如@Joachim Pileborg所说。诸如valgrind或地址清理工具之类的工具可以为您做到这一点,但是自己做这件事只允许定位一部分分配,因此对性能的影响较小
  • 使用自定义分配机制,例如生成对齐的地址(用于SSE或其他硬件要求),或在共享内存中分配,或使用内存池,或在特定地址分配以满足低级别驱动程序需求
  • 使用与编译器/标准库提供的算法不同的分配算法。根据您的分配和线程模式,选择适当的分配策略可以提高性能。