默认栈大小

7
如何在Code::Blocks中增加堆栈大小?
我已经阅读了这篇文章,其中提到VS的默认堆栈大小为1MB。但就我所知,这与VS无关,堆栈大小取决于操作系统。在我的Win10中,它是1MB。 这篇文章似乎有点过时了,因为按照其建议:`project->build options->linker settings->other linker options` 已不再存在。
项目栏下面没有“build”选项。
无论如何,我需要增加我的堆栈大小,以便声明一个巨大的二维字符数组并从中受益。像 `arr[1000][1000] `一样。因为它将在连续的内存上,而不是像 `char* arr[100]`那样指向包含1000个字节的1000个不同内存地址。
我使用的是Windows 10 mingw编译器。

栈上的内存并没有什么神奇之处。它不会比从堆中分配的内存更快。 - Harry Johnston
@HarryJohnston 是的,但是将整个东西放在连续的插槽中会从缓存中获益。与使用malloc在堆上分配时不同,那样我将有1000个不同的段和更多的缓存未命中。 - Tony
1
哦,我明白了 - 你认为你需要分配1000个不同的1000字节块。其实不用这样。只需分配一个100万字节的单一块,并将其转换为二维数组即可。在Java中无法这样做,但在C/C++中可以正常工作。 - Harry Johnston
语法有点棘手:char (*arr)[1000] = (char(*)[1000])malloc(1000*1000); - Harry Johnston
@HarryJohnston 能否解释一下呢 :) ? 这是一种分配1000个1000字节块并将它们放在连续的内存块中的方法吗?如果是,为什么不一开始就使用二维数组呢?感谢您的评论! - Tony
显示剩余2条评论
1个回答

6
默认大小来自.exe文件,而不是操作系统。
MSDN

保留和最初分配的堆栈内存的默认大小在可执行文件头中指定。

具体来说,堆栈保留和提交大小在PE文件的IMAGE_OPTIONAL_HEADER结构中指定。这通常可以使用链接器参数设置为特定值。使用MinGW工具链,您可以尝试像-Wl,--stack,52428800这样的gcc参数。此选项可能存在于您正在使用的IDE中,请查找构建和/或链接器设置。
这适用于第一个线程,如果您在调用CreateThread时指定了非零值,则其他线程可以覆盖默认值。

但是在这篇文章http://gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html中说它是**操作系统相关的**...? - Yousha Aleayoub
2
这个答案中没有任何与此相矛盾的内容。在Windows操作系统中,这个特定的头文件用于指定堆栈大小。只有Windows使用PE文件来生成其二进制文件,因此其他操作系统的行为将有所不同。 - Sean Burton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接