3、对变量在栈上存储顺序,及函数返回值与参数在栈上存放顺序的思考(1)

    一直以来,在思考函数调用中,其参数,返回地址的关系。在以前的一篇文章中,也曾看到过这种关系:

    函数在堆栈中的分布情况是,地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段。[1]

于是,我进行了测试。我们都知道:在函数内定义的普通变量放在栈上,而只有用malloc,new等申请的内存,才放在堆上。用static标识的变量,和全局变量一样,放在全局存储区。[2]

而在栈上存放的变量,一般都是按照地址从高到低的顺序存放。所以,分几步测试。用VS2005GCC分别进行。

1)测试在栈上存放的变量,一般都是按照地址从高到低的顺序存放。

VS2005

#include "stdafx.h"

#include <stdio.h>

#include "iostream"

using namespace std;

int main()

{

int a;

int b;

cout << &a <<endl

     << &b <<endl;

}

3、对变量在栈上存储顺序,及函数返回值与参数在栈上存放顺序的思考(1)

    我们可观察到,其在栈内,两个变量是按由高到低的顺序存放的。可是,为什么却占用了12个字节呢?

当我们将编译选项由debug,变为release后,其显示如下所示:

3、对变量在栈上存储顺序,及函数返回值与参数在栈上存放顺序的思考(1)

也就是此时,是4个字节。我的机器是32位的。可见,显示的不同,是由编译选项的不一样而引起的,这是编译器对内存进行优化而得到的结果。(具体是怎么样一个做法,相请高人解释)

当我们用GCC编译器时,其结果如下所示:

3、对变量在栈上存储顺序,及函数返回值与参数在栈上存放顺序的思考(1)

    由上可见,对于这个概念,是没有什么异议的。

参考:

[1] http://www.cnblogs.com/mydomain/archive/2010/07/27/1785667.html

[2] 变量的生存期和作用域

http://blog.163.com/zhoumhan_0351/blog/static/39954227200982104921868/

上一篇:Node.js 写的可以在浏览器中使用的 xlsx 解析/生成器


下一篇:extjs4.2 desktop 核心文件 + 换行 + 图标拖动