【问题标题】:How to avoid dynamically allocating small objects?如何避免动态分配小对象?
【发布时间】:2017-01-20 12:15:48
【问题描述】:

我发现很多时候我只需要一个小的std::map(比如少于10个键),或者一个只包含几个元素的小std::vector,我认为总是动态分配它们真的很浪费性能,尤其是在std::map<std::string, std::string>std::vector<std::string> 这样的结构中,确实涉及到很多动态分配。

有什么好的建议吗?至少减少动态分配的量,更好的不牺牲易用性。谢谢

【问题讨论】:

  • 通常,如果这是您代码中的瓶颈,一种方法是编写或使用memory pool。本质上,您预先分配了一堆内存,然后一遍又一遍地重新使用它,而无需重新分配。
  • 如果您使用飞行关键软件,您总是可以在初始化期间分配空间。否则,如果您需要一些真正的性能或遇到瓶颈,则必须编写自定义内存分配器。
  • 您是否实际测量过此类分配的成本?仅仅将代码片段“思考”为瓶颈就是更改代码的构建指南。因此,请首先执行一些措施来验证这项工作是否值得。
  • 您可以将std::vector::reserve与向量一起使用,或将Allocators与其他容器一起使用来实现您自己的分配策略。
  • 这个问题对我来说太宽泛了。您是否正在尝试解决实际问题?谈论 10 个元素然后抱怨总是将它们分配为性能问题......好吧,我的猜测是您在性能问题方面缺乏经验让您认为那里有问题。

标签: c++ c++11 memory-management


【解决方案1】:

您可以为 small 大小的数据使用 stack 分配的内存(因为堆栈分配非常快,基本上只是堆栈指针的移动;虽然堆栈的空间很宝贵并且这是一个非常有限的资源),并且为 更大 大小分配了 内存。换句话说,按照std::string小字符串优化的思路思考。

此外,为了加快分配速度,您还可以在堆上预先分配大内存块,然后在这些块内划分较小的分配,同样基本上只是在块内增加一个指针。有关此池分配器技术的示例实现,请考虑阅读this blog post

您会发现这个 CppCon 2016 演讲也很有趣:

High Performance Code 201: Hybrid Data Structures

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多