在 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&lt;K, V&gt;实际上是这样的:

std::map&lt;K, V, Pred, Alloc&gt;

由于您没有在地图声明中提及Pred,因此默认为std::less&lt;T&gt;

同样Alloc 默认为std::allocator&lt;std::pair&lt;const Key, T&gt; &gt;,其中std::pair&lt;const Key, T&gt; 是您地图的隐含value_type

Alloc 表示的类决定了映射中值的分配方式和位置。

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

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

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

【讨论】:

我认为一般来说,提出此类问题的用户不能也不应该编写自定义分配器。【参考方案3】:

你的变量在静态数据区,但是他map也会在堆增长的时候分配额外的空间。

【讨论】:

以上是关于在 cpp 中声明为静态的动态增长向量的主要内容,如果未能解决你的问题,请参考以下文章

声明和修改结构的静态数组 -CPP

.cpp 文件中的 C++ 静态对象声明

链接静态库

g++ 编译动态链接库和静态链接库

c语言静态函数调用问题

动态绑定与静态绑定