從匯編看c++中函數(shù)里面的static關(guān)鍵字的使用說明
下面從匯編語言看其原理.
下面是c++源代碼:
void add() {
static int i = 1;
i++;
}
int main() {
add();
}
下面是main對(duì)應(yīng)的匯編碼
; 5 : int main() {
push ebp
mov ebp, esp
; 6 : add();
call ?add@@YAXXZ ; 調(diào)用add
; 7 :
; 8 : }
xor eax, eax
pop ebp
ret 0
下面是add函數(shù)對(duì)應(yīng)的匯編碼:
; 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;執(zhí)行加法
mov DWORD PTR ?i@?1??add@@YAXXZ@4HA, eax;存變量i的值
; 4 : }
pop ebp
ret 0
可以看,不論是main函數(shù),還是add函數(shù)里面,我們都看不到為i分配存儲(chǔ)空間,也就是說,i不在他們的調(diào)用棧里面。
再看下面的匯編碼:
_DATA SEGMENT
?i@?1??add@@YAXXZ@4HA DD 01H ; 為變量i聲明存儲(chǔ)空間
; Function compile flags: /Odtp
_DATA ENDS
這條語句為i預(yù)先分配了存儲(chǔ)空間,并且在上面兩個(gè)函數(shù)匯編碼的外面定義。因此,函數(shù)里面由static關(guān)鍵字修飾的變量生命期存在于整個(gè)程序里面,但是,可見性依然只在add函數(shù)里面,在外面訪問不到.
相關(guān)文章
C++設(shè)計(jì)模式中控制反轉(zhuǎn)與依賴注入淺析
這篇文章主要介紹了C++設(shè)計(jì)模式中控制反轉(zhuǎn)與依賴注入,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01C語言實(shí)現(xiàn)學(xué)生宿舍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生宿舍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03淺析C語言中printf(),sprintf(),scanf(),sscanf()的用法和區(qū)別
以下是對(duì)C語言中printf(),sprintf(),scanf(),sscanf()的用法以及區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07C語言中#define在多行宏定義出錯(cuò)的原因及分析
這篇文章主要介紹了C語言中#define在多行宏定義出錯(cuò)的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02