程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 從匯編看c++中變量類型的深入分析

從匯編看c++中變量類型的深入分析

編輯:C語言基礎知識

全局變量的生命期和可見性是整個程序的運行期間,下面就來用匯編來看一下實際情況:

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。

實際上,在操作系統載入可執行文件的時候,它首先將數據區中的數據載入相應的內存,然後才開始運行程序,因此,全局變量產生在文件加載之後,第一條程序語言執行之前。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved