我有以下片段
Class Sample
{ Obj_Class1 o1;
Obj_Class2 o2;};
但是Obj_Class1
和Obj_Class2
的大小非常大,因此编译器会显示警告“考虑将一些空间移动到堆中”。我被要求用Obj_Class1* o1 = new Obj_Class1();
替换Obj_Class1 o1但是我觉得没有使用这个更改,因为如果堆栈分配失败,堆分配也会失败。我对么?或者进行此更改是有意义的(除了抑制编译器警告之外)。
答案 0 :(得分:5)
堆栈通常比堆小。它们使用不同的内存位置。堆栈的大小通常约为兆字节(您可以更改它,但要小心)并按每个线程分配。如果需要,堆可以消耗千兆字节。
答案 1 :(得分:3)
堆栈通常很小,不适合容纳大型对象,而堆是独立的并为它们设计。
在您的示例中,您应该在堆上分配整个Sample
,而不是其成员:
int main() {
Sample* sample = new Sample();
}
答案 2 :(得分:3)
默认情况下,堆栈相当小:http://msdn.microsoft.com/en-us/library/ms686774(VS.85).aspx
保留和初始提交的堆栈内存的默认大小在可执行文件头中指定。如果没有足够的内存来保留或提交所请求的字节数,则线程或光纤创建将失败。链接器使用的默认堆栈保留大小为1 MB。要为所有线程和光纤指定不同的默认堆栈预留大小,请使用模块定义(.def)文件中的STACKSIZE语句。操作系统将指定大小四舍五入到系统分配粒度的最接近倍数(通常为64 KB)。要检索当前系统的分配粒度,请使用GetSystemInfo函数。
答案 3 :(得分:2)
对于visual studio,默认情况下每个线程获得1 MB空间,如果尝试分配更多,则会出现堆栈溢出错误。堆没有此限制,您可以分配的内存量取决于进程虚拟内存中可用的最大连续空间。因此,如果对象非常庞大,堆栈分配就会失败,这并不奇怪。