【问题标题】:What is considered a small object in C++?什么被认为是 C++ 中的小对象?
【发布时间】:2011-03-27 00:44:32
【问题描述】:

我在“现代 C++ 设计”中阅读了有关小对象分配的内容。 Andrei Alexandrescu 认为通用运算符(new 和 delete)在分配小对象时表现不佳。

在我的程序中,在免费商店中创建和销毁了许多对象。这些对象的大小超过 8000 字节。

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

【问题讨论】:

  • 对象是单独测量 8000 字节,还是累计测量?虽然@KennyTM 说它依赖于实现,但在每个对象 8000 字节的情况下,并没有多少现实世界的实现会认为该对象很小
  • @Jared P,每个对象的大小超过 8000 个字节。我的程序应该可以在 Windows 和 Linux 服务器系统上高效运行。

标签: c++ memory-management


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    只有当您收到有关软件占用过多 RAM 或分析器指出内存管理中的性能瓶颈的抱怨时,您才应该开始担心。否则,现代内存管理相对快速且稳健。

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

    【讨论】:

      【解决方案3】:

      我当然不会认为 8000 字节是“小”的。小对象很可能意味着占用不超过几百字节的对象 - 数量为少数字节的对象将导致最大的问题 - 然而正如 KennyTM 指出的那样,这取决于实现,并且一些 C++ 运行时可能很擅长处理小物件。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2017-07-03
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多