Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我们限制堆栈的大小而不限制内存中的堆 我主要用C++编程。我从很多地方看到,我应该将大型对象(比如10k元素的数组)放在堆上(使用new),而不是堆栈上(使用纯数组类型)。 我真的不明白。原因可能是滥用堆栈导致运行时堆栈溢出错误。但为什么操作系统应该为进程(或者更准确地说,线程)的堆栈大小设置一个限制,因为虚拟内存可以根据需要变大(实际上是4G)。 谁能帮帮我,我真的不知道。_C++_Memory_Stack - Fatal编程技术网

为什么我们限制堆栈的大小而不限制内存中的堆 我主要用C++编程。我从很多地方看到,我应该将大型对象(比如10k元素的数组)放在堆上(使用new),而不是堆栈上(使用纯数组类型)。 我真的不明白。原因可能是滥用堆栈导致运行时堆栈溢出错误。但为什么操作系统应该为进程(或者更准确地说,线程)的堆栈大小设置一个限制,因为虚拟内存可以根据需要变大(实际上是4G)。 谁能帮帮我,我真的不知道。

为什么我们限制堆栈的大小而不限制内存中的堆 我主要用C++编程。我从很多地方看到,我应该将大型对象(比如10k元素的数组)放在堆上(使用new),而不是堆栈上(使用纯数组类型)。 我真的不明白。原因可能是滥用堆栈导致运行时堆栈溢出错误。但为什么操作系统应该为进程(或者更准确地说,线程)的堆栈大小设置一个限制,因为虚拟内存可以根据需要变大(实际上是4G)。 谁能帮帮我,我真的不知道。,c++,memory,stack,C++,Memory,Stack,完全可以使用10k整数的静态数组。通常最好使用“new”,因为在处理大块数据时,不能保证它们始终与数组大小相同。动态内存分配允许您只使用所需的内存。效率更高 如果您对操作系统如何选择堆栈大小或“页面”感到好奇,请阅读以下内容: 另外,我不确定您使用“heap”的方式是否正确。“heap”是一种基于树的数据结构。堆栈指的是RAM中可执行文件和进程数据的布局。传统和线程 堆栈是每个线程的,为了提高效率,必须有连续的内存空间。非连续堆栈使每个函数调用的成本更高 堆通常在线程之间共享;当它们不是时,它

完全可以使用10k整数的静态数组。通常最好使用“new”,因为在处理大块数据时,不能保证它们始终与数组大小相同。动态内存分配允许您只使用所需的内存。效率更高

如果您对操作系统如何选择堆栈大小或“页面”感到好奇,请阅读以下内容:


另外,我不确定您使用“heap”的方式是否正确。“heap”是一种基于树的数据结构。堆栈指的是RAM中可执行文件和进程数据的布局。

传统和线程

堆栈是每个线程的,为了提高效率,必须有连续的内存空间。非连续堆栈使每个函数调用的成本更高

堆通常在线程之间共享;当它们不是时,它们不必是连续的

在32位时代,拥有1000个线程并非不可能。每个线程1兆字节,即1千兆字节的地址空间。一个梅格没那么大

相比之下,2 Gig的堆服务于所有线程

在64位系统上,通常可寻址内存远小于64位。在40位时,如果将一半的地址空间提供给堆栈,并且有10000个线程,那么每个堆栈只有50兆

48位更为常见,但这仍然使每个堆栈仅有千兆字节的地址空间

相比之下,堆有十个字节

更重要的是,堆栈上有一个大对象对缓存一致性没有多大帮助;没有cpu缓存可以容纳tront和back。如果您正在大量使用单个指针,则必须遵循该指针是微不足道的,甚至可以确保堆栈更好地保留在缓存中

因此,(a)堆栈大小成本与线程成比例(b)地址空间可能受到限制(c)巨型堆栈的好处很小


最后,无限递归是一个常见的错误。您希望在用户shell因资源耗尽而崩溃之前,堆栈被吹出并捕获(二进制加载器经常用陷阱页面包围堆栈)。适度大小的堆栈更容易实现这一点。

没有一般限制。看看这个问题:无论如何,你为什么想要一个巨大的堆栈大小,你不应该需要它。递归并不常用,尤其是在堆栈上存储了大量数据的情况下。但为什么操作系统要在32位应用程序中设置进程堆栈大小的限制堆栈空间的大小限制了可以在windows上创建的线程的数量。使用1MB堆栈,您可以在耗尽整个2GB的用户地址空间之前创建大约2000个线程。这是否回答了您的问题?(使用新)在现代的
c++
代码中不鼓励使用
new
。向量更合适。这是一个好问题。但是以前有人问过;请务必阅读副本中的答案。“堆栈必须是连续的内存空间”是堆栈在大小和速度上受到限制的一个很好的原因。谢谢