堆栈与堆,用于需要全局范围的固定数量的对象

Ant*_*ony 1 c++ heap stack memory-management

我知道有关堆栈与堆的问题已被多次询问,但我对选择如何在C++中声明对象的一个​​小方面感到困惑.

我知道用"new"运算符访问的堆用于动态内存分配.根据Stack Overflow上另一个问题的答案,"堆用于存储数据,其中存储的生命周期无法提前确定".堆栈比堆快,似乎用于本地范围的变量,即,当相关的代码段完成时,变量会自动删除.堆栈还具有相对有限的可用空间量.

在我的例子中,我知道在运行时之前我将需要一个指向特定类的500个对象的指针数组,并且我知道我将需要在整个运行时期间存储指针和对象.堆没有意义,因为我事先知道我需要多长时间才能记忆,而且我确切地知道我将需要多少对象.如果范围有限,堆栈也没有意义; 另外,我不知道它是否能真正保存我的所有对象/指针.

处理这种情况的最佳方法是什么?为什么?谢谢!

zwo*_*wol 5

堆栈中分配的对象main()具有整个程序运行的生命周期,因此这是一个选项.500个指针的数组是2000或4000字节,具体取决于您的指针是32位还是64位 - 如果您在堆栈限制很小的环境中进行编程,您就会知道它(这样的环境确实存在:例如,内核模式堆栈通常总共 8192个字节或更小)所以我会毫不犹豫地将数组放在那里.

根据对象的大小,将它们放在堆栈上也是合理的 - 现在用户空间中的典型堆栈限制是8 兆字节的数量级,这不是很大,你可以完全忽略它,但不是花生,或者.

如果它们对于堆栈太大,我会认真考虑创建一个全局变量,它是一个对象本身的数组.这方面的主要缺点是你无法准确控制何时初始化.如果对象具有重要的构造函数,则很可能是一个问题.另一种方法是将对象的存储分配为全局变量,在main使用placement new 的适当位置初始化它们,并在出路时显式调用它们的析构函数.这需要在有例外的情况下小心; 我写了一个封装了这份工作的一次性RAII课程.