2012-10-12 84 views
2

我学会了一些超载新/删除“C++入门”。但我很好奇:作为默认新/删除是那么好,我应该什么时候超载呢?我什么时候应该重载new /删除C++

+2

我有时会用它来重载它们以添加跟踪到内存分配,所以我可以知道分配内存块的时间和位置,作为一种调试帮助。 –

+0

优化的第一条规则:*测量,优化,测量*主题上的反响:只有当*证明*确实有必要时才重载新/删除。 *然后*证明你没有认为更糟。 ;) – DevSolar

+0

@JoachimPileborg严格地说,这不是超载,而是更换。 (然而,这可能是OP想到的那种事情。) –

回答

3

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

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

1

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

1

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

一般情况下,这是一个坏主意,做自己分配,因为它有很多的权衡决策,使一个复杂的问题。

1

一些用例浮现在脑海:

  • 跟踪内存分配和释放,为@Joachim Pileborg说。等工具的valgrind或地址消毒剂能为你做,但做自己允许只指定分配的一个子集,因此对表演
  • 使用自定义分配机制的影响较小,例如生产对齐地址(SSE,或其他硬件的要求),或分配共享内存中,或使用一个内存池,或在特定的地址分配的底层驱动程序需要
  • 使用不同的分配算法比你的编译器/标准库提供的一个。根据您的分配和线程模式,选择适当的分配策略可能会提高性能。
2

在课堂上,超载他们的通常原因是使用 内存池。这通常只对非常小的类很有用,其中 将被动态分配;例如图中的节点,例如 示例,其中池分配器可以显着提高地点和分配/解除分配速度。

您也可以重载全局new和delete操作使用特殊 分配器(比如从内存中的特定区域分配)。然而,这可能是 棘手,因为无法在删除表达式中指定附加的 参数。实事求是地讲,当你做 这一点,你也必须更换非安置new和delete 运营商,并安排新的运营商以某种方式保存必要的 信息来找到正确的删除器。

,当然还有,虽然没有超载,可以取代全球新 和delete操作符,与被仪表收集有关分配和删除 信息的,用于调试 目的(或因为你有一些自定义布局新/删除)。

您应该不是做什么与全局新/删除在库中。 由于您所做的任何事情都需要替换非放置表单,因此在库中执行此操作会有风险冲突(如果用户还需要在其主应用程序中执行 )。

相关问题