国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

從匯編看c++中extern關鍵字的使用

2020-01-26 16:17:45
字體:
來源:轉載
供稿:網友

在c++中,extern關鍵字用來聲明變量和函數,在聲明函數的時候,有和沒有extern的效果一樣,即下面兩條語句具有同樣的效果:

復制代碼 代碼如下:

extern void fun();
void fun();

  但是對于變量,有和沒有extern就有區別,當有extern時,只是告知編譯器存在這個變量,編譯器并不為該變量分配存儲空間,即真正的聲明;若沒有extern,則在聲明的同時,編譯器也為該變量分配存儲空間。

下面是有extern的情形時的c++源碼:

復制代碼 代碼如下:

int main() {
    extern int i;
}

下面是對應的匯編碼:
復制代碼 代碼如下:

; 1    : int main() {

    push    ebp
    mov    ebp, esp;esp為指向棧頂的一個寄存器,始終指向棧頂 ebp也是一個寄存器,用來在給main函數分配的棧空間上尋訪局部變量,因此常常作為基址
                ;上面兩句的作用是將前一個棧的基址保存(壓棧),然后讓ebp指向當前函數的??臻g,再次作為基址

; 2    :     extern int i;
; 3    : }

    xor    eax, eax
    pop    ebp
    ret    0;這三句是用來退棧用,以及函數的返回


從上面的匯編碼可以看出,并沒有為變量i在站上分配任何存儲空間

下面是沒有extern的情形的c++源碼:

復制代碼 代碼如下:

int main() {
    int i;
}

下面是對應的匯編碼:
復制代碼 代碼如下:

; 1    : int main() {

    push    ebp
    mov    ebp, esp
    push    ecx;與有extern時的最大的不同就是這一句
               ;ecx也是一個寄存器,這里講ecx的值壓棧,等同于為變量i在棧上分配了存儲空間
               ;由于ecx中的值不確定,因此,如果我們訪問沒有初始化的局部變量,常常得到一個奇怪的值

; 2    :     int i;
; 3    : }

    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0


可以看出,沒有extern關鍵字時,確實為變量i在棧上分配了存儲空間

上面的匯編使用cl指令在命令行產生的,如果用vs2010來產生匯編碼,匯編碼可能不一樣,但意思是一樣的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻城市| 建平县| 兴国县| 普定县| 拜城县| 嘉荫县| 朝阳县| 敖汉旗| 正定县| 安塞县| 汕头市| 民丰县| 金华市| 肥东县| 鲁山县| 阳原县| 临澧县| 清流县| 沙雅县| 岳西县| 枣庄市| 利川市| 广宗县| 彰化县| 龙口市| 安乡县| 荆门市| 平舆县| 三穗县| 修武县| 呼玛县| 同心县| 吴堡县| 台南市| 湖南省| 如皋市| 新昌县| 民乐县| 仁化县| 丰宁| 雷山县|