gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:07:36 25 4
gpt4 key购买 nike

我知道关于栈和堆的问题已经被问过好几次了,但我对选择如何在 C++ 中声明对象的一个​​小方面感到困惑。

我知道堆——用“new”运算符访问——用于动态内存分配。根据对 Stack Overflow 上另一个问题的回答,“堆用于存储无法提前确定存储生命周期的数据”。堆栈比堆快,而且似乎用于局部范围的变量,即当相关代码段完成时,变量会自动删除。堆栈的可用空间也相对有限。

在我的例子中,我知道在运行前我需要一个指向特定类的 500 个对象的指针数组,而且我知道我需要在整个运行时期间存储这些指针和对象。堆没有意义,因为我事先知道我需要多长时间的内存,而且我确切地知道我需要多少人对象。如果范围有限,堆栈也没有意义;另外,我不知道它是否真的可以容纳我所有的对象/指针。

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

最佳答案

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

根据您的对象有多大,将它们放在堆栈上也是合理的——如今用户空间中的典型堆栈限制是 8 兆字节,它没有大到你可以完全忽略它,但也不是花生。

如果它们对于堆栈来说太大了,我会认真考虑制作一个全局变量,它是对象本身的数组。这样做的主要缺点是您无法精确控制它们的初始化时间。如果对象具有非平凡的构造函数,这很可能是个问题。另一种方法是为对象分配存储 作为全局变量,在 main 中的适当位置使用 placement new 初始化它们,并在退出时显式调用它们的析构函数。这需要在出现异常时小心;我会编写一个封装该作业的一次性 RAII 类。

关于c++ - 对于需要全局范围的固定数量的对象,堆栈与堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com