Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++ 某个程序的堆栈内存有多大,是否有编译器标志可以设置它?_C++_C_Memory_Size_Stack - Fatal编程技术网

C++ 某个程序的堆栈内存有多大,是否有编译器标志可以设置它?

C++ 某个程序的堆栈内存有多大,是否有编译器标志可以设置它?,c++,c,memory,size,stack,C++,C,Memory,Size,Stack,正如标题所述:关于堆栈的大小是否有任何通用的“经验法则”。我猜大小会因操作系统、体系结构、缓存大小、可用RAM数量等而异 但是,一般来说可以说什么,或者有没有办法找出这个程序允许使用的堆栈的多少?。作为一个额外的问题,是否有任何方法(使用编译器标志等(这里主要考虑C/C++,但也更一般))可以由用户将堆栈的大小设置为固定大小 顺便说一句,我的要求完全是出于好奇,我没有堆栈溢出。:) 是的,您可以设置堆栈大小,它通常是一个链接器标志,并且取决于您的工具链(通常由编译器名称引用) 更改大小,以及

正如标题所述:关于堆栈的大小是否有任何通用的“经验法则”。我猜大小会因操作系统、体系结构、缓存大小、可用RAM数量等而异

但是,一般来说可以说什么,或者有没有办法找出这个程序允许使用的堆栈的多少?。作为一个额外的问题,是否有任何方法(使用编译器标志等(这里主要考虑C/C++,但也更一般))可以由用户将堆栈的大小设置为固定大小


顺便说一句,我的要求完全是出于好奇,我没有堆栈溢出。:)

是的,您可以设置堆栈大小,它通常是一个链接器标志,并且取决于您的工具链(通常由编译器名称引用)

  • 更改大小,以及
  • 对于GCC工具链和大多数其他Unix链接器,请使用
    -Wl,--stack

您还可以在这里找到有关StackOverflow的几个现有问题。

在Windows中,不管操作系统如何,线程的默认堆栈大小都是一百万字节

在托管代码(C#、VB等)中,您可以使用此ctor强制新线程具有不同的堆栈大小:

要更改Windows程序默认线程的堆栈大小(无论是否受管理),可以使用editbin实用程序:


一般来说,给定程序将使用的堆栈数量是不可确定的(它相当于。您是否在问如何明确强制限制堆栈大小?首先,您可能会对这个问题感兴趣,谢谢!但为什么这是不可判定的,相当于停止问题?@Anders:程序可用的堆栈大小定义得非常好。一个任意程序正确运行所需的堆栈量类似于该程序的停止问题(通常是不可确定的——大多数特定程序都允许分析)。@Andersannerupkristensen:因为为了确定最大堆栈使用量,您基本上需要分析所有可能的代码路径(我相信您可以看到,这与停止问题所造成的问题非常相似)。不过,在某些(可能很多)情况下,这可以通过静态分析来解决。但是递归或函数指针使这变得棘手。实际上,默认大小(如果将0传递给
CreateThread
)与启动线程的堆栈大小相同(在PE头中指定)。@BenVoigt:我不知道,但这很有意义。谢谢!只是附加信息:用于创建本机线程的API(允许指定堆栈大小)GCC/GNU ld中的is
--stack
是特定于Windows的。它不用于其他目标。@R..:选项的拼写是否不同(
-stack\u size
)或者您认为没有选项?没有选项。在unix系统上,初始线程的最大堆栈大小由
ulimit
命令/
setrlimit
函数确定,但在Linux上,保留/提交的堆栈大小固定在大约128k,外加一点额外的大小,这似乎取决于环境(132k或136k是典型的总数)。如果程序试图将堆栈增长到超过该值,并且内存可用,它可以增长到
ulimit
/
setrlimit
设置的限制,但是在
exec
发生时,无法保留超过~128k的内存。@R..:嗯,我知道大多数(可能全部)在我使用的嵌入式目标中,有这样一个链接器选项。所以Linux似乎是个怪人。我不认为“内存可用”是相关的,除非您已禁用交换和过度提交,否则唯一重要的是是否有足够的连续虚拟地址空间。我通常认为过度提交已禁用。保持启用过度提交将导致出现严重错误、不一致、危险不稳定的系统。:-)无论如何,即使启用了Overmit,试图扩大堆栈也会触发OOM杀手终止进程。