2011-09-29 53 views
1

使用GCC(Windows 32,仅限C,默认构建选项)。本地大小可在本地使用

什么是我的本地堆栈的最大尺寸..?

例如:

void myfunc (void) 
{ 
char is_this_too_big_for_a_local_var[64*1024*1024]; 

somefunc(is_this_too_big_for_a_local_var); 
} 
在我的编码的初期

可能是从一些惨痛经历,我 从未尝试过使用比大多数16K本地存储更多..(是的,习惯 挑在286的日子里,16位电脑)

无论如何,在本地定位真的很大的变量好吗?还是几K还是 的上限?

回答

3

即使你的系统有一个大堆栈,你也不应该养成使用它的习惯。由于每个线程的堆栈需要足够大以容纳尽可能大的堆栈使用,并且创建该线程的代码将要使用pthread_attr_setstacksize(或相当于),以避免花费更多的虚拟地址空间,并在每个线程上承担超出必要的费用。

编辑:下面是一个“便携式”(以POSIX系统)方式的点子,以确保你有你想要你的主线程的堆栈空间:

  1. 在主年初,复制argv到新分配的内存。
  2. 然后用所需的堆栈大小创建一个新线程,并将其传递给argv的副本。如果所需的大小不可用,这将失败并报告错误。
  3. 在新线程中,使用新的argv重新调用main,但设置了全局标志以避免重复步骤1/2。
  4. pthread_exit从最初的“主线程”,并将您的新线程视为“主线程”。