【问题标题】:Default stack size默认堆栈大小
【发布时间】:2017-07-14 05:28:36
【问题描述】:

如何增加 Code::Blocks 中的堆栈大小?

我读过this,它说VS 中的默认堆栈大小是1MB。现在就我而言,它与 VS 无关,堆栈大小取决于操作系统。在我的 win10 情况下,它是 1MB。

This 似乎有点过时,如下所示:project->build options->linker settings->other linker options 不再存在。

项目栏下没有构建。

无论如何,我需要增加我的堆栈大小,以便我可以声明一个巨大的二维字符数组并从缓存中受益。喜欢arr[1000][1000]。因为它将位于连续内存上,而 char* arr[100] 将指向包含 1000 个字节的 1000 个不同的内存地址。

我正在使用 Windows 10 mingw 编译器。

【问题讨论】:

  • 堆栈上的内存并没有什么神奇之处。它不会比从堆中分配的内存快。
  • @HarryJohnston 是的,但是将整个东西放在一个连续的插槽中将从缓存中受益。与使用 malloc 在堆上分配时不同,我将有 1000 个不同的段和更多的缓存未命中。
  • 哦,我明白了 - 你认为你必须分配 1000 个不同的 1000 字节块。你没有。只需分配一百万字节的单个块,并将其转换为二维数组。比如说,你不能在 Java 中做到这一点,但它在 C/C++ 中可以正常工作。
  • 语法有点棘手:char (*arr)[1000] = (char(*)[1000])malloc(1000*1000);
  • @HarryJohnston 请解释一下 :) ?这是一种分配 1000 个 1000 字节的块并将它们放在一个连续的内存块中的方法吗?如果是这样,为什么不首先使用二维数组?不过感谢您的评论!

标签: c++ c arrays windows codeblocks


【解决方案1】:

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

来自MSDN

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

具体来说,堆栈保留和提交大小在 PE 文件的 IMAGE_OPTIONAL_HEADER 结构中指定。这通常可以使用链接器参数设置为特定值。使用 MinGW 工具链,您可以尝试将 -Wl,--stack,52428800 作为 gcc 参数。此选项可能存在于您正在使用的 IDE 中,只需查找构建和/或链接器设置即可。

这适用于第一个线程,如果您在调用CreateThread时指定一个非零值,其他线程可以覆盖默认值。

【讨论】:

  • 但是在这篇文章中gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html 说它是依赖于操作系统的...?
  • 这个答案中没有什么与此相矛盾的。在 Windows 操作系统上,此特定标头用于指定堆栈大小。只有 Windows 将 PE 文件用于其二进制文件,因此其他操作系统的行为会有所不同。
猜你喜欢
  • 1970-01-01
  • 2014-01-11
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多