将大对象存储在堆上而不是堆栈中会产生什么后果(如果有的话)?我记得读过最好在堆栈上放置更大的对象来限制堆碎片......这是真的吗? 感谢
编辑:问题来自我正在制作的游戏,我的基本对象将有关于纹理,实体等的所有信息很可能在堆上创建,我真的不知道它的大小,我们可以假设300 MB
答案 0 :(得分:6)
一般没有。
这取决于实现,但在许多系统上,堆栈的大小比堆大得多。如果在堆上分配了大量(小)对象,堆碎片通常会成为一个问题。它也往往是由某些分配模式和deallocation 引起的。
答案 1 :(得分:1)
你必须记住堆栈是有限的。可以在某些环境中配置大小,但它也有缺点。如果你的对象是短暂的,它们可以驻留在堆栈上,但是为了能够长时间保存它们,你必须创建它们并继续调用函数并将它们作为参数传递,因为当范围结束时,你的对象就会消失窗口。
在编辑之后,你无法在堆栈中存储300 MB的对象。
答案 2 :(得分:1)
你应该根据物品的存放时间应该比它们的尺寸更大来决定放置物体的位置;但是,由于堆栈相当有限,在其上创建一个大对象有时不是一个好主意,它可能是new
的必要/更具前瞻性,并将指针放在scoped_ptr
中}。
如果你有足够的大对象导致严重的堆碎片,或者你有一个对象本身就是一个重要的因素(说实话,我不确定这是否可能),是你确定你的设计是对的吗?另请注意,您的对象可能小于容器使用的存储空间,并且该存储(std::array
的存储除外)都是动态分配的,即在堆上。
答案 3 :(得分:0)
通常,应在堆上创建大型对象 。堆栈通常只应用于与特定堆栈上下文相关的小对象。