全局變量的生命期和可見性是整個程序的運行期間,下面就來用匯編來看一下實際情況:
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。
實際上,在操作系統載入可執行文件的時候,它首先將數據區中的數據載入相應的內存,然後才開始運行程序,因此,全局變量產生在文件加載之後,第一條程序語言執行之前。