menu

hjk41的日志

Avatar

Effective C++ 笔记10: 在重载操作符 new 的同时重载 delete

为什么要重载 new 和 delete ?
最主要原因是因为默认的 new 和 delete 函数太慢了,它们要判断很多特殊情况,同时要防止内存碎片的产生……这些工作都是要花时间的。

另外,我们对一个指针进行 delete 操作时,delete 函数需要知道这个指针指向的区域有多大,这就需要保存一个数来指示区域大小,所以如果我们申请一个 Airplane 对象,那内存分配情况可能就是这样的:

这个额外的空间开销有时候会让人很头疼的,特别是在使用很多小对象的时候。

对这种大量小对象的情况,默认的 new 和 delete 的缺点暴露无疑,首先要多次的调用 new 和 delete,这就使效率问题突出出来;另外,用于记录区域大小的额外内存开销很可能会大于对象所占的内存大小。对这种情况,我们完全可以先申请一大段内存,然后在创建一个新对象的时候从这一大段内存中划出一小块来给新对象,这样就不会有额外的内存开销,且算法上也很简单。至于具体如何做,我这里就不说了。

为什么要同时重载 new 和 delete ?
很显然,如果我们重载了 new 而不重载 delete ,两者的行为就没办法匹配了,因为这时我们并不会像上面的图一样记录对象大小,所以默认的 delete 函数肯定会出错。如果要让 new 和 delete 协调工作,只能同时重载它们。

评论已关闭