gpt4 book ai didi

c++ - std::map 分配节点打包?

转载 作者:可可西里 更新时间:2023-11-01 15:54:28 25 4
gpt4 key购买 nike

我注意到 Visual Studio (2010) 的 std::map 实现为其红黑树中的每个节点分配了一个新的单 block 内存。也就是说,对于映射中的每个元素,将通过 operator new ... malloc 使用 Visual Studio STL 实现的 std::map 的默认分配方案分配一个新的原始内存块.

这对我来说有点浪费:在“(小)n” block 中分配节点是否更有意义,就像 std::vector 实现在增长时过度分配一样?

所以我想澄清以下几点:

  • 我关于默认分配方案的断言实际上是正确的吗?
  • std::map 的“所有”STL 实现都是这样工作的吗?
  • std 中是否有任何东西阻止 std::map 实现将其节点放入内存块,而不是为每个节点分配新的内存块(通过其分配器)? (复杂性保证等)?

注意:这不是过早优化。 如果它是关于优化的,那么它是关于如果一个应用程序有 (std::)map 内存碎片的问题,是否有替代方法来使用使用内存池的自定义分配器?这个问题不是关于自定义分配器,而是关于 map 实现如何使用它的分配器。 (或者我希望是这样。)

最佳答案

你的断言对于大多数 std::map 实现都是正确的。

据我所知,标准中没有任何内容阻止 map 使用您描述的分配方案。但是,您可以使用自定义分配器获得您所描述的内容——但是在所有映射上强制使用该方案可能会造成浪费。由于 map a priori 不知道它将如何使用,因此某些使用模式可能会阻止大部分未使用的 block 的重新分配。例如,假设 block 一次分配给 4 个节点,但特定映射填充了 40 个节点,然后删除了 30 个节点,最坏的情况是每个 block 留下一个节点,因为映射不能使指向该节点的指针/引用/迭代器无效最后一个节点。

关于c++ - std::map 分配节点打包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4212646/

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