3、对变量在栈上存储顺序,及函数返回值与参数在栈上存放顺序的思考(1)
一直以来,在思考函数调用中,其参数,返回地址的关系。在以前的一篇文章中,也曾看到过这种关系:
函数在堆栈中的分布情况是,地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段。[1]
于是,我进行了测试。我们都知道:在函数内定义的普通变量放在栈上,而只有用malloc,new等申请的内存,才放在堆上。用static标识的变量,和全局变量一样,放在全局存储区。[2]
而在栈上存放的变量,一般都是按照地址从高到低的顺序存放。所以,分几步测试。用VS2005和GCC分别进行。
1)测试在栈上存放的变量,一般都是按照地址从高到低的顺序存放。
用VS2005
#include "stdafx.h"
#include <stdio.h>
#include "iostream"
using namespace std;
int main()
{
int a;
int b;
cout << &a <<endl
<< &b <<endl;
}
我们可观察到,其在栈内,两个变量是按由高到低的顺序存放的。可是,为什么却占用了12个字节呢?
当我们将编译选项由debug,变为release后,其显示如下所示:
也就是此时,是4个字节。我的机器是32位的。可见,显示的不同,是由编译选项的不一样而引起的,这是编译器对内存进行优化而得到的结果。(具体是怎么样一个做法,相请高人解释)
当我们用GCC编译器时,其结果如下所示:
由上可见,对于这个概念,是没有什么异议的。
参考:
[1] http://www.cnblogs.com/mydomain/archive/2010/07/27/1785667.html
[2] 变量的生存期和作用域
http://blog.163.com/zhoumhan_0351/blog/static/39954227200982104921868/