【问题标题】:Dynamically growing vector which is declared static in cpp在 cpp 中声明为静态的动态增长向量
【发布时间】:2018-04-01 13:09:48
【问题描述】:

我了解静态变量分配在数据段中(而不是在堆栈和堆中)。

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

static TestMap testMapInstance;

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

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

【问题讨论】:

标签: c++ vector static


【解决方案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也会在堆增长的时候分配额外的空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多