如何计算提交栈和保留栈的大小

 

http://community.csdn.net/Expert/topic/5156/5156011.xml?temp=.5120203

 

今天上午在饼子堂里讨论提交栈和保留栈,饼子们各舒己见,不过还是没有解答我的疑惑
故此开本比武贴请各方英豪同台献技,交流切磋,共同进益。
一、本此比武的内容
1、本贴主要讨论提交栈(commited stack)和保留栈(reserved stack)的具体含义,及
   c/c++程序员应该如何设置这两个编译选项的值
2、名词解释
   本文中所说的提交栈(commited stack)和保留栈是指windows平台下pe文件格式中_IMAGE_OPTIONAL_HEADER
   结构中的两个成员
   DWORD   SizeOfStackReserve;               //栈的保留大小                      72-75
    DWORD   SizeOfStackCommit;                //提交的栈的大小                    76-79 
   pe文件的官方规范见
   http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/pecoff_v8.doc
3、编译选项的设置
在vc6的菜单中,project->settings->link,在category中选择output,即可看到reserve和commit的输入框
  
二、讨论时的假设
为简化讨论,抓住问题的本质,对示例代码中的函数做如下要求
1、各函数的参数个数在编译时已知,函数的返回类型均为void
2、函数中的声明语句均为基本类型或者基本类型的数组,
    诸如动态数组、结构数组、自定义类型数组不在考虑范围之内
3、函数间的调用均为直接调用,不存在递归关系,换句话,调用层数在编译时已知,阅读者从代码即可算出函数的调用层数
4、为了避免编译器优化掉未使用的变量,函数中的语句均为简单赋值语句,这样就不考虑临时对象的产生

综上所述,示例代码应保证函数栈中最好只为如下对象分配空间:
1、返回地址
2、数目固定的形参
3、数目已知的简单局部变量


三、示例代码
int main(int argc, char* argv[])
{
int buf[2<<20]={0};   //故意分配一个溢出的栈
buf [2<<19] = 1;
return 0;
}
这个代码在vc6可以编译通过,但是运行会提示stack overflow

四、比武要求
1、要求通过修改1.3中说的选项设置,使代码运行通过,并给出你设置的reserve和commit的值,
设置值最小者将获得50分的奖励
2、写出你的设置的根据,即在满足二、的假设的前提下,如何来计算reserve stck和commit stack
的取值范围,最好能给出一个通用的计算公式,达到此要求者奖励100分。
3、你可以自己写出其他测试代码说明你对这两个概念的理解,参与者奖励50分

你可能感兴趣的:(如何计算提交栈和保留栈的大小)