gpt4 book ai didi

c++ - vector (容器)是否需要使用 "allocator"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:47 24 4
gpt4 key购买 nike

我正在研究如何创建自定义容器,例如 eaSTL 的容器和其他几个模型,我发现它们都使用“分配器”,就像 std::vectorstd::allocator。这让我开始思考,为什么 vector 容器的新实现使用分配器,而它们通常具有针对 newdelete 的底层内存管理覆盖?

最佳答案

能够替换operator new()operator delete() (及其数组版本)在程序级别可能足以满足小程序的需求。如果您的程序包含数百万行代码,运行许多不同的线程,这根本不适合。您经常想要甚至需要更好的控制。为了有效地使用自定义分配器,您还需要能够使用与外部分配器相同的对象来分配子对象。

例如,考虑在某种可能运行多线程的服务器中响应请求时使用内存区域。从 operator new() 获取内存可能相当昂贵,因为它涉及分配锁并在越来越碎片化的堆中找到合适的内存块。为避免这种情况,您只想分配几 block 内存(理想情况下只有一个,但您可能事先不知道所需的大小)并将所有对象放在那里。分配器可以做到这一点。为此,您需要将这 block 内存通知所有分配内存的实体,即您需要将分配器传递给所有可能分配内存的对象。如果你分配例如一个std::vector<std::string, A> std::string对象应该知道分配器:只是告诉 std::vector<std::string, A>在何处以及如何分配内存不足以避免大多数内存分配:您还需要将其告知 std::string (嗯,实际上是 std::basic_string<char, std::char_traits<char>, B> 适合分配器类型 BA 相关)。

也就是说,如果你真的想控制你的内存分配,你肯定想将分配器传递给所有分配内存的东西。使用全局内存管理工具的替换版本可能对您有所帮助,但它受到相当大的限制。如果您只想编写一个自定义容器,而内存分配不是您的主要关注点,则您不必费心。然而,在长时间运行的大型系统中,内存分配是众多问题之一。

关于c++ - vector (容器)是否需要使用 "allocator"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9075405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com