天天看點

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;

}

3、對變量在棧上存儲順序,及函數傳回值與參數在棧上存放順序的思考(1)

    我們可觀察到,其在棧内,兩個變量是按由高到低的順序存放的。可是,為什麼卻占用了12個位元組呢?

當我們将編譯選項由debug,變為release後,其顯示如下所示:

3、對變量在棧上存儲順序,及函數傳回值與參數在棧上存放順序的思考(1)

也就是此時,是4個位元組。我的機器是32位的。可見,顯示的不同,是由編譯選項的不一樣而引起的,這是編譯器對記憶體進行優化而得到的結果。(具體是怎麼樣一個做法,相請高人解釋)

當我們用GCC編譯器時,其結果如下所示:

3、對變量在棧上存儲順序,及函數傳回值與參數在棧上存放順序的思考(1)

    由上可見,對于這個概念,是沒有什麼異議的。

參考:

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

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