從彙編看c++中變數類型的深入分析

來源:互聯網
上載者:User

全域變數的生命期和可見度是整個程式的運行期間,下面就來用彙編來看一下實際情況:

c++源碼:

複製代碼 代碼如下:int i = 2;//全域變數

int main() {
int j = i;
}

下面是彙編代碼:

複製代碼 代碼如下:PUBLIC ?i@@3HA ; i
_DATA SEGMENT
?i@@3HA DD 02H ; 全域變數i記憶體空間
_DATA ENDS
PUBLIC _main
; Function compile flags: /Odtp
; File c:\users\administrator\desktop\c++\test\a.cpp
_TEXT SEGMENT
_j$ = -4 ; size = 4
_main PROC

; 3 : int main() {

push ebp
mov ebp, esp
push ecx;為局部變數分配4位元組儲存區

; 4 : int j = i;

mov eax, DWORD PTR ?i@@3HA ; 擷取全域變數i的的值
mov DWORD PTR _j$[ebp], eax;eax存有i的值,將它賦給局部變數j

; 5 : }

xor eax, eax
mov esp, ebp;//棧頂指標恢複,釋放為j分配的棧空間
pop ebp
ret 0
_main ENDP
_TEXT ENDS

從組合語言中可以看到,全域變數i的記憶體配置在記憶體中的資料區(由_DATA指定),因此在程式啟動並執行過程中始終存在,所以對於程式中的所有部分都可以訪問,而且隨著程式的結束銷毀;而局部變數j的記憶體是在運行main函數中在棧上動態分配,而且main函數結束後,此空間被釋放,因此在main函數外面不能訪問局部變數j。

實際上,在作業系統載入可執行檔的時候,它首先將資料區中的資料載入相應的記憶體,然後才開始運行程式,因此,全域變數產生在檔案載入之後,第一條程式語言執行之前。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.