下面從匯編語言看其原理.
下面是c++源代碼:
代碼如下:
void add() {
static int i = 1;
i++;
}
int main() {
add();
}
下面是main對應的匯編碼
代碼如下:
; 5 : int main() {
push ebp
mov ebp, esp
; 6 : add();
call ?add@@YAXXZ ; 調用add
; 7 :
; 8 : }
xor eax, eax
pop ebp
ret 0
下面是add函數對應的匯編碼:
代碼如下:
; 1 : void add() {
push ebp
mov ebp, esp
; 2 : static int i = 1;
; 3 : i++;
mov eax, DWORD PTR ?i@?1??add@@YAXXZ@4HA;取變量i的值
add eax, 1;執行加法
mov DWORD PTR ?i@?1??add@@YAXXZ@4HA, eax;存變量i的值
; 4 : }
pop ebp
ret 0
可以看,不論是main函數,還是add函數裡面,我們都看不到為i分配存儲空間,也就是說,i不在他們的調用棧裡面。
再看下面的匯編碼:
代碼如下:
_DATA SEGMENT
?i@?1??add@@YAXXZ@4HA DD 01H ; 為變量i聲明存儲空間
; Function compile flags: /Odtp
_DATA ENDS
這條語句為i預先分配了存儲空間,並且在上面兩個函數匯編碼的外面定義。因此,函數裡面由static關鍵字修飾的變量生命期存在於整個程序裡面,但是,可見性依然只在add函數裡面,在外面訪問不到.