什么被认为是C ++中的一个小对象?

时间:2010-08-08 19:27:13

标签: c++ memory-management

我读过“现代C ++设计”中的小对象分配。 Andrei Alexandrescu辩称,通用运算符(new和delete)在分配小对象时表现不佳。

在我的程序中,在免费商店中创建和销毁了很多对象。这些对象的测量值超过8000个字节。

什么尺寸被认为是小的?在C ++中进行内存分配时,8000字节是小还是大?

4 个答案:

答案 0 :(得分:13)

“small”的定义各不相同,但一般来说,如果一个对象的大小小于堆分配引起的大小开销(或者至少接近该大小),则可以认为该对象是“小”。

因此,在大多数情况下,16字节的对象可能会被视为“小”。在某些特定情况下,32字节对象可能被认为是小的。一个8,000字节的对象绝对不是“小”。

通常,如果您要经历使用小型对象分配器的麻烦,那么您希望提高某些代码块的性能。如果使用小型对象分配器对您的性能没有帮助,您可能不应该使用它。

答案 1 :(得分:3)

  

[...]认为通用运算符(new和delete)在分配小对象时表现不佳。

依赖于平台。例如。在Linux上我曾经使用静态内存管理对比了我自己开发的AVL树,而GNU的std :: map是红黑树和完全动态的内存管理。令我惊讶的是,std :: map有时会超出我自己的高效实现。并且std :: map会进行大量的小内存分配。

  

在我的程序中,在免费商店中创建和销毁了很多对象。

内存管理问题是一个有效的问题。从某种意义上说,如果可能,您应该始终尝试重用现有资源,或者避免创建临时副本。

如果您追求效率/ CPU性能。如果代码很少运行,那么打扰是没有意义的。

  

这些对象的大小超过8000个字节。什么尺寸被认为是小的?在C ++中进行内存分配时,8000字节是小还是大?

这是毫无意义的问题。如果你的程序需要一个8K的对象,那么你的程序需要它。周期。

只有当您收到抱怨软件需要太多内存或分析器指向内存管理中的性能瓶颈时,才应该开始担心。否则,现代内存管理相对快速而且健壮。

P.S。我个人认为8K是一个平均内存分配大小。不小 - 不大。但是我已经习惯了在一开始就在堆上分配10 + GB的程序。如果数据集必须驻留在RAM中并且大小为10GB,那么应用程序别无选择,只能尝试加载它。

答案 2 :(得分:1)

我当然不会认为8000字节是'小'。小对象很可能意味着占用不超过几百个字节的对象 - 相当于少量字节的对象将导致最大的问题 - 但是KennyTM指出这是依赖于实现的,并且一些C ++运行时可能很好地处理小物件。

答案 3 :(得分:0)

问题不在于,对象有多小,但是,运算符new / delete调用了多少内存开销?如果你的对象不止于此,那就不是那么小了。