在 cpp 中声明为静态的动态增长向量
Posted
技术标签:
【中文标题】在 cpp 中声明为静态的动态增长向量【英文标题】:Dynamically growing vector which is declared static in cpp 【发布时间】:2018-04-01 13:09:48 【问题描述】:我了解静态变量分配在数据段中(而不是在堆栈和堆中)。
std::map< std::string, testClass*> TestMap;
static TestMap testMapInstance;
这里的 testMapInstance 是一个动态增长的地图。我们推送通过new(堆)分配的testClass。
编译器如何分配这个静态变量以及在哪里? 这种情况下的内存限制是多少(这张地图可以增长多少)?
【问题讨论】:
testClass
在堆中分配,它是从TestMap
引用的,注意你使用了testClass *
。
When vectors are allocated, do they use memory on the heap or the stack?的可能重复
【参考方案1】:
虽然std::map
对象 本身可能在数据段中,但键值存储没有在那里分配。
这只是不可能,因为键值对的数量在编译时是未知的,只有在运行时才知道。
因此,键值对必须在堆中动态分配。
【讨论】:
【参考方案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
【讨论】:
我认为一般来说,提出此类问题的用户不能也不应该编写自定义分配器。【参考方案3】:你的变量在静态数据区,但是他map
也会在堆增长的时候分配额外的空间。
【讨论】:
以上是关于在 cpp 中声明为静态的动态增长向量的主要内容,如果未能解决你的问题,请参考以下文章