Mad*_*adH 53 c++ memory-management overloading
除非您正在编程操作系统或嵌入式系统的某些部分,否则有任何理由这样做?我可以想象,对于一些特定的类经常重载内存管理函数或引入一个对象池而创建和销毁的类可能会降低开销,但是在全局范围内做这些事情?
另外
我刚刚在重载的删除功能中发现了一个错误 - 内存并不总是被释放.这是一个不那么重要的内存关键应用程序.此外,禁用这些过载会使性能降低约0.5%.
lea*_*der 76
我们工作的全局new和delete运算符超载了很多原因:
新/删除记帐的想法非常灵活和强大:例如,您可以在发生分配时记录活动线程的整个callstack,并汇总有关该记录的统计信息.如果由于某种原因没有空间将其保留在本地,您可以通过网络发送堆栈信息.您可以在这里收集的信息类型仅受您的想象力(当然还有表现)的限制.
我们使用全局重载,因为在那里挂起许多常见的调试功能很方便,并且根据我们从相同的重载中收集的统计信息,在整个应用程序中进行彻底的改进.
我们仍然会为个别类型使用自定义分配器; 在许多情况下,通过为例如STL数据结构的单个使用点提供自定义分配器可以获得的加速或功能远远超过可以从全局过载中获得的一般加速.
看一下C/C++的一些分配器和调试系统,你会很快想出这些和其他的想法:
(一本古老而又开创性的书是编写固体代码,它讨论了您可能希望在C中提供自定义分配器的许多原因,其中大多数仍然非常相关.)
显然,如果你可以使用任何这些精美的工具,你会想要这样做而不是自己动手.
在某些情况下,它更快,更容易,更少的商业/法律麻烦,没有什么可用于您的平台,或只是更具指导性:挖掘和编写全局超载.
Cra*_*rks 15
除了这里提到的其他重要用途,如内存标记,它也是强制应用程序中的所有分配都通过固定块分配的唯一方法,这对性能和碎片有很大的影响.
例如,您可能有一系列具有固定块大小的内存池.覆盖全局new
允许您将所有61字节分配定向到具有64字节块的池,所有768-1024字节分配到1024b块池,所有那些高于2048字节块池,以及任何更大的分配一般衣衫褴褛的堆比8kb多.
因为固定块分配器比从堆中无条件地分配更快且更不容易碎片化,这使得你甚至可以强制从池中分配糟糕的3d派对代码,而不是整个地址空间.
这通常在对时间和空间至关重要的系统中完成,例如游戏.280Z28,Meeh和Dan Olson描述了原因.
Sam*_*ell 10
UnrealEngine3将全局new和delete重载为其核心内存管理系统的一部分.有多个分配器提供不同的功能(分析,性能等),并且需要所有分配来完成它.
编辑:对于我自己的代码,我只会做它作为最后的手段.我的意思是,我几乎肯定不会使用它.但我的个人项目显然要小得多,要求也差异很大.