我知道静态变量是在数据段中分配的(不在堆栈和堆中)。
std::map< std::string, testClass*> TestMap;
static TestMap testMapInstance;
这里testMapInstance是一个动态增长的地图。我们推送通过new(heap)分配的testClass。
编译器如何分配这个静态变量? 在这种情况下内存限制是多少(这个地图可以增长多少)?
答案 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
还会在堆增长时从堆中分配额外的空间。