【问题标题】:How big can a globally declared data structure be?全局声明的数据结构可以有多大?
【发布时间】:2015-05-27 08:01:28
【问题描述】:

我有一个全局向量,我将数据加载到其中,然后在我的程序中稍后从该向量中读取。

如果我说,1000000 个元素被推回到这个向量中,它会导致任何问题,例如由于堆栈溢出而产生的问题吗?全局范围内有多少可用内存空间?

【问题讨论】:

  • 假设您使用的是 std::vector 类型的局部变量,它不会使用堆栈内存,而是使用堆内存。使用的内存总量取决于您的标准库实现以及每个元素的大小,以及每个元素如何管理自己的内存。你在向量中放入什么数据类型?

标签: c++ vector data-structures global-variables heap-memory


【解决方案1】:

根据C++11 section 23,除非您的类型提供专门的分配器,否则vector 等序列容器将使用std::allocator,它使用new 获取内存。换句话说,使用动态内存分配函数(外行用语中的“从堆”)。

因此,只要您遵守规则,就无法使用该容器破坏堆栈,如果您执行以下操作可能会出现这种情况:

void function(void) {
    int xyzzy[999999999];
    :
}

这并不是说你不能用完内存,堆的大小不是无限的,如下代码所示:

#include <iostream>
#include <vector>

int main (void) {
    std::vector<const char*> *v = new std::vector<const char*>();
    long count = 0;
    while (1) {
        try {
            v->push_back("xyzzy");
            count++;
        } catch (std::exception &e) {
            std::cout << e.what() << '\n';
            break;
        }
    }
    std::cout << count << " pushbacks done.\n";
    return 0;
}

哪个输出(在我的系统上):

std::bad_alloc
134217728 pushbacks done.

但是因为内存不足而引发异常与堆栈溢出或静态存储持续时间(“全局”)空间不足导致的损坏相去甚远。

【讨论】:

    【解决方案2】:

    问题:

    如果我说,1000000 个元素被推回到这个向量中,会不会导致诸如溢出堆栈之类的问题?

    不,不会。创建std::vector 时,数据的内存是从堆中分配的,而不是从为全局数据保留的内存中分配的。

    问题:

    全局范围内有多少可用内存空间?

    我没有答案。给出第一个问题的答案可能无关紧要。

    您可能会发现 this answer to another SO post 相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      相关资源
      最近更新 更多