全局声明的数据结构可以有多大

How big can a globally declared data structure be?

本文关键字:声明 数据结构 全局      更新时间:2023-10-16

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

如果我说,1000000个元素被推回这个向量,它会引起任何问题吗,比如那些溢出堆栈所产生的问题?在全局范围内有多少可用内存空间?

根据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.

但是,由于内存不足而导致异常与堆栈溢出或静态存储持续时间("全局")空间不足导致的损坏相去甚远。

问题:

如果我说,1000000个元素被推回这个向量,它会引起任何问题吗,比如那些溢出堆栈所产生的问题?

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

问题:

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

我对此没有答案。考虑到第一个问题的答案,这可能无关紧要。

你可能会发现这个答案与另一篇SO帖子相关。