Mar*_* Ba 10 c++ memory-management stl
我注意到Visual Studio(2010)的std :: map实现为其红黑树中的每个节点分配了一个新的单个内存块.也就是说,对于映射中的每个元素,将使用operator new ... mallocVisual Studio STL实现的std :: map的默认分配方案分配单个新的原始内存块.
这对我来说有点浪费:在"(小)n"块中分配节点会不会更有意义,就像std :: vector实现在增长时过度分配一样?
所以我想澄清以下几点:
注意:这不是过早优化.如果它关于优化,那么它关于如果应用程序有问题(std::)映射内存碎片,是否有使用自定义分配器使用内存池的替代方法?这个问题不是关于自定义分配器,而是关于地图实现如何使用其分配器.(或者我希望是这样.)
对于std :: map的大多数实现,您的断言都是正确的.
据我所知,标准中没有任何内容阻止地图使用您描述的分配方案.但是,您可以使用自定义分配器获得您所描述的内容 - 但是在所有地图上强制执行该方案可能会浪费.因为map没有关于如何使用它的先验知识,所以某些使用模式可以防止大部分未使用的块的解除分配.例如,假设块一次分配给4个节点,但是一个特定的映射填充了40个节点,然后删除了30个节点,最坏的情况是每个块留下一个节点,因为映射不能使指针/引用/迭代器无效最后一个节点