你什么时候重载操作员新?

Fra*_*ank 9 c++ memory-management object operators new-operator

可能重复:
任何导致全局新增和删除的原因?

在什么情况下超载是完全合理的operator new

我听说你是在一个经常分配使用的课程中完成的new.你能给我举个例子吗?

还有其他情况你想要超载operator new吗?

更新:感谢目前为止的所有答案.有人能给出一个简短的代码示例吗?当我问起上面的一个例子时,这就是我的意思.类似的东西:这是一个小玩具类,这是一个operator new适合那个班级的人.

zeb*_*box 12

每个类超载的一些原因
1.仪表即跟踪分配,调用程序上的审计跟踪,如文件,行,堆栈.
2.优化的分配例程,即内存池,固定块分配器.
3.专门的分配器,即"在启动时分配一次"对象的连续分配器 - 经常用于游戏编程,用于需要持续整个游戏的内存等
.4.对齐.这在大多数非桌面系统上都很重要,特别是在游戏控制台中,您经常需要在例如16字节边界上进行分配
.5.专用内存存储(同样主要是非桌面系统),例如非可缓存内存或非本地内存


gbj*_*anb 4

我发现的最好的情况是通过提供多个固定大小的块堆来防止堆碎片。即,您创建一个完全由 4 字节块组成的堆,另一个由 8 字节块组成,等等。

这比默认的“全合一”堆效果更好,因为您可以重用一个块,知道您的分配将适合第一个空闲块,而无需检查或遍历堆寻找合适大小的可用空间。

缺点是你会消耗更多的内存,如果你有一个 4 字节堆和一个 8 字节堆,并且想要分配 6 字节..你必须将它放在 8 字节堆中,浪费2 字节。如今,这几乎不再是问题(特别是当您考虑替代方案的开销时)

您可以对此进行优化,如果要进行大量分配,则可以创建一个确切大小的堆。就我个人而言,我认为浪费一些字节不是问题(例如,您分配了很多 7 字节,使用 8 字节堆并不是什么大问题)。

我们为一个非常高性能的系统做到了这一点,并且效果非常好,它极大地减少了由于分配和堆碎片而导致的性能问题,并且对其余代码完全透明。