动态增长的向量在cpp

时间:2017-10-20 11:04:07

标签: c++ vector static

我知道静态变量是在数据段中分配的(不在堆栈和堆中)。

std::map< std::string, testClass*> TestMap;

static TestMap testMapInstance;

这里testMapInstance是一个动态增长的地图。我们推送通过new(heap)分配的testClass。

编译器如何分配这个静态变量? 在这种情况下内存限制是多少(这个地图可以增长多少)?

3 个答案:

答案 0 :(得分:3)

虽然std::map 对象本身可能位于数据段中,但键值存储分配在那里。

它只是不能因为在编译时不知道键值对的数量,只能在运行时知道。

因此,键值对必须动态分配堆。

答案 1 :(得分:2)

可能值得提醒自己std::map<K, V>实际上就是这样:

std::map<K, V, Pred, Alloc>

由于您在地图声明中未提及Pred,因此默认为std::less<T>

同样地,Alloc默认为std::allocator<std::pair<const Key, T> >,其中std::pair<const Key, T>是地图隐含的value_type

Alloc表示的类确定分配地图中值的方式和位置。

std::allocator<X>使用::operator new::operator delete来分配和释放内存。除非你重新定义了这些,否则内存将由堆管理。

您可以通过为Alloc指定自己的自定义类型来覆盖此设置。然而,成功地做到这一点是一种黑暗的艺术。您可能需要在尝试之前阅读它。

参考:http://en.cppreference.com/w/cpp/concept/Allocator#Allocator_completeness_requirements

答案 2 :(得分:1)

您的变量位于静态数据区域中,但是map还会在堆增长时从堆中分配额外的空间。