2010-01-31 80 views
8

可能重复:
Any reason to overload global new and delete?你什么时候重载operator new?

在什么情况下,它可以完美地超负荷operator new

我听说您在使用new经常分配的类做到这一点。你能给个例子吗?

以及是否有其他情况下,你会想重载operator new

更新:感谢到目前为止所有的答案。有人能给出一个简短的代码示例吗?当我问到上面的一个例子时,这就是我的意思。像这样:这是一个小玩具班,这里是一个工作operator new该类。

+7

没有试图成为一个冲洗,但有用的答案会发现与搜索:http://stackoverflow.com/questions/1152511/any-reason-to-overload-global-new-and-delete – Skurmedel 2010-01-31 15:08:45

+0

@Skurmedel:但那只是关于全球运营商新(和删除)。一般来说,我是在问运营商的新业务是否过载,例如在一个班级。 – Frank 2010-01-31 15:12:03

+0

我不明白为什么其他原因会有所不同,除了不同的范围。 – Skurmedel 2010-01-31 15:44:46

回答

3

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

这比默认的'all in one'堆更好,因为你可以重用块,知道你的分配将会适合第一个空闲块,而不必检查或漫步堆寻找合适大小的空闲空间。

的缺点是,你使用更多的内存,如果您有一个4字节堆和一个8个字节的堆,并希望分配6个字节..你将不得不把它放在8-字节堆,浪费2个字节。现在,这不是什么问题(特别是当你考虑替代方案的开销时)

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

我们这样做了很高性能的系统,和它的工作奇妙,它降低了我们的性能问题,由于分配和堆碎片显着,是完全透明的代码的其余部分。

+1

不确定你试过这个操作系统。但Windows堆管理器已经使用这种方法。如果别人不这样做,我会感到惊讶。 – 2010-01-31 15:46:58

+1

C++内存管理针对快速出现和消失的小块进行了优化。试图重新优化它可能不适合你的普通程序员。上面提供的描述也是几乎所有内存管理系统都使用的一种非常常见的方案。重新实施它将不会提供任何好处。 – 2010-01-31 18:59:55

+0

一般情况下,小块分配优化工作到什么样的大小?我特别感兴趣的是GCC的最新版本。 – 2010-01-31 20:14:56

0

你可以在你想控制某些对象的内存分配的情况下使用它。就像只有在堆中分配小对象时一样,您可以为1k对象分配空间,并使用新运算符先分配1k对象,然后使用该空间直至用完。

3

一些原因重载操作者新

  1. 跟踪和内存分析,并检测内存泄漏
  2. 要创建对象池(说对于粒子系统)来优化存储器使用
11

每类超负荷的原因
1.仪表即跟踪分配,调用者的审计跟踪,如文件,线路,堆栈。
2.优化的分配例程,例如内存池,固定块分配器。
3.专门的分配器i。e连续分配器,用于'在启动时分配一次'对象 - 频繁用于需要为整个游戏持续存储的游戏编程等。
4.对齐。对于大多数非桌面系统来说,这是一个很大的问题,尤其是在你经常需要分配的游戏控制台上。 16字节的边界
5.专门的内存存储(大部分非桌面系统),如不可缓存的内存或非本地内存

相关问题