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

时间:2010-01-31 15:01:23

标签: c++ object operators memory-management new-operator

  

可能重复:
  Any reason to overload global new and delete?

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

我听说你是在一个经常使用new分配的课堂上做的。你能给我举个例子吗?

还有其他情况需要重载operator new吗?

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

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

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

这比默认的'all in one'堆更好用,因为你可以重用一个块,知道你的分配适合第一个空闲块,而不必检查或遍历堆寻找一个正确的空闲空间尺寸。

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

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

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

答案 2 :(得分:3)

重载运算符新

的一些原因
  1. 跟踪和分析内存,并检测内存泄漏
  2. 创建对象池(比如粒子系统)以优化内存使用

答案 3 :(得分:0)

如果您想控制某个对象的内存分配,请执行此操作。就像你有只能在堆上分配的小对象一样,你可以为1k对象分配空间,并使用new运算符首先分配1k对象,并使用空间直到用完为止。