代码之家  ›  专栏  ›  技术社区  ›  Jan Deinhard

什么是C++中的小对象?

  •  5
  • Jan Deinhard  · 技术社区  · 15 年前

    我读过关于“现代C++设计”中的小对象分配。AndreiAlexandrescu认为通用运算符(new和delete)在分配小对象方面表现不佳。

    在我的程序中,有许多对象是在自由存储中创建和销毁的。这些对象的大小超过8000个字节。

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

    4 回复  |  直到 15 年前
        1
  •  13
  •   James McNellis    15 年前

    “小”的定义有所不同,但一般来说,如果对象的大小小于堆分配(或至少接近该大小)导致的大小开销,则可以将其视为“小”。

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

    通常,如果您要解决使用小对象分配器的问题,那么您需要改进一些代码块的性能。如果使用一个小的对象分配器对您的性能没有帮助,您可能不应该使用它。

        2
  •  3
  •   Dummy00001    15 年前

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

    取决于平台。例如,在Linux上,我曾经用静态内存管理和GNU的std::map(红黑树和完全动态内存管理)对我自己的AVL树进行基准测试。令我惊讶的是,std::map有时会超过我自己的 高效 实施。而std::map执行危险的小内存分配量。

    在我的程序中,有许多对象是在自由存储中创建和销毁的。

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

    这就是您所追求的效率/CPU性能。如果代码很少运行,那么麻烦是毫无意义的。

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

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

    只有当您收到软件占用太多RAM或探查器指向内存管理中的性能瓶颈的投诉时,才应该开始担心。否则,现代内存管理就相对快速和健壮。

    P.S.I个人认为8K是平均内存分配大小。不小-不大。但我已经习惯于使用那些在堆上临时分配10+GB的程序。如果数据集必须驻留在RAM中,并且大小为10GB,那么应用程序除了尝试加载之外别无选择。

        3
  •  1
  •   Will A    15 年前

    我当然不会认为8000字节是“小”字节。小对象最有可能意味着不超过几百字节的对象-对象数量达到了一小撮字节将导致最大的问题-然而,正如KennyTM指出的,这是依赖于实现的,并且一些C++运行时在处理小对象方面可能是非常好的。

        4
  •  0
  •   Puppy    15 年前

    问题不是,对象有多小,但是,操作员new/delete调用了多少内存开销?如果你的物体不止这些,那么它就不那么小了。