欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從匯編看c++中引用與指針的使用分析

 更新時(shí)間:2013年05月06日 10:37:22   作者:  
在c++中,引用和指針具有相同的作用,都可以用來在函數(shù)里面給變函數(shù)外面對(duì)象或者變量的值,下面就來看他們的原理

首先是引用情形下的c++源碼:

復(fù)制代碼 代碼如下:

void add(int a, int b, int&c) {
    c = a + b;
}


int main() {
    int a = 1;
    int b = 2;
    int c = 0;
    add(a, b, c);

}


下面是main對(duì)應(yīng)的匯編碼:
復(fù)制代碼 代碼如下:

; 6    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 12                    ; 為該調(diào)用函數(shù)的??臻g預(yù)留12byte,用來存儲(chǔ)局部變量a,b, c

; 7    :     int a = 1;

    mov    DWORD PTR _a$[ebp], 1;初始化a _a$為a存儲(chǔ)空間地址相對(duì)于ebp基址的偏移量

; 8    :     int b = 2;

    mov    DWORD PTR _b$[ebp], 2;初始化b _b$為b存儲(chǔ)空間地址相對(duì)于ebp基址的偏移量

; 9    :     int c = 0;

    mov    DWORD PTR _c$[ebp], 0;初試化c _c$為c存儲(chǔ)空間地址相對(duì)于ebp基址的偏移量

; 10   :     add(a, b, c);
    lea    eax, DWORD PTR _c$[ebp]; 獲取c存儲(chǔ)空間相對(duì)于ebp基址的偏移量(即c存儲(chǔ)單元的偏移地址),放在寄存器eax中
    push    eax;保存c存儲(chǔ)空間的偏移量到堆棧中
    mov    ecx, DWORD PTR _b$[ebp];將b存儲(chǔ)空間里面的值(即b的值)放在寄存器ecx中
    push    ecx;保存b存儲(chǔ)空間的值到堆棧中
    mov    edx, DWORD PTR _a$[ebp];將a存儲(chǔ)空間里面的值(即a的值)放在寄存器edx里面
    push    edx;保存a存儲(chǔ)空間的到堆棧

    ;上面push eax push ecx push edx在棧里面存儲(chǔ)了原來局部變量a,b,c的值,只不過對(duì)于c來說,存儲(chǔ)的是c存儲(chǔ)空間的偏移地址
    ;因此,對(duì)于a,b來說,也就是將他們的值得一份拷貝存了起來,也就是傳值;而c只是存儲(chǔ)了自己存儲(chǔ)空間的偏移地址,也就是傳地址
    call    ?add@@YAXHHAAH@Z            ; 調(diào)用add函數(shù),上面的語句已經(jīng)為傳遞參數(shù)做好了準(zhǔn)備
    add    esp, 12                    ; 由于剛才為調(diào)用函數(shù)add傳遞參數(shù)進(jìn)行了壓棧,這里釋放??臻g,即釋放參數(shù)
                                ;這就是為什么函數(shù)調(diào)用完成后局部變量和參數(shù)無效的原因,因?yàn)樗麄兊目臻g被釋放了

; 11   :    
; 12   : }

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


下面是函數(shù)add對(duì)應(yīng)的匯編碼:
復(fù)制代碼 代碼如下:

; 1    : void add(int a, int b, int&c) {

    push    ebp
    mov    ebp, esp

; 2    :     c = a + b;

    mov    eax, DWORD PTR _a$[ebp];取參數(shù)a的值到寄存器eax中
    add    eax, DWORD PTR _b$[ebp];取參數(shù)b的值與eax中a的值相加,結(jié)果放到eax中
    mov    ecx, DWORD PTR _c$[ebp];去c的偏移地址放到寄存器ecx中
    mov    DWORD PTR [ecx], eax;將eax中的結(jié)果寫到由ecx指定的地址單元中去,即c所在存儲(chǔ)單元

; 3    : }

    pop    ebp
    ret    0


從上面可以看到,對(duì)于傳值,c++確實(shí)傳的是一份值拷貝,而對(duì)于引用,雖然是傳值的形式,但是其實(shí)編譯器內(nèi)部傳遞的是值得地址

下面是指針的情形的c++源碼:

復(fù)制代碼 代碼如下:

void add(int a, int b, int* c) {
    *c = a + b;
}


int main() {
    int a = 1;
    int b = 2;
    int c = 0;
    add(a, b, &c);

}


mian函數(shù)對(duì)應(yīng)的匯編碼:
復(fù)制代碼 代碼如下:

; 6    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 12                    ;

; 7    :     int a = 1;

    mov    DWORD PTR _a$[ebp], 1

; 8    :     int b = 2;

    mov    DWORD PTR _b$[ebp], 2

; 9    :     int c = 0;

    mov    DWORD PTR _c$[ebp], 0

; 10   :     add(a, b, &c);

    lea    eax, DWORD PTR _c$[ebp]
    push    eax
    mov    ecx, DWORD PTR _b$[ebp]
    push    ecx
    mov    edx, DWORD PTR _a$[ebp]
    push    edx
    call    ?add@@YAXHHPAH@Z            ; add
    add    esp, 12                    ;
; 11   :    
; 12   : }

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


add函數(shù)對(duì)應(yīng)的匯編碼:
復(fù)制代碼 代碼如下:

; 1    : void add(int a, int b, int* c) {

    push    ebp
    mov    ebp, esp

; 2    :     *c = a + b;

    mov    eax, DWORD PTR _a$[ebp]
    add    eax, DWORD PTR _b$[ebp]
    mov    ecx, DWORD PTR _c$[ebp]
    mov    DWORD PTR [ecx], eax

; 3    : }

    pop    ebp
    ret    0


可以看到,指針和引用的匯編碼一樣,因此兩者的作用也一樣

相關(guān)文章

  • C++中protobuf?的交叉編譯使用詳解

    C++中protobuf?的交叉編譯使用詳解

    為了提高通信效率,可以采用?protobuf?替代?XML?和?Json?數(shù)據(jù)交互格式,protobuf?相對(duì)來說數(shù)據(jù)量小,在進(jìn)程間通信或者設(shè)備之間通信能夠提高通信速率。下面介紹?protobuf?在?ARM?平臺(tái)上的使用,需要的朋友可以參考下
    2022-07-07
  • C++詳解默認(rèn)參數(shù)的構(gòu)造函數(shù)及簡(jiǎn)單實(shí)例代碼

    C++詳解默認(rèn)參數(shù)的構(gòu)造函數(shù)及簡(jiǎn)單實(shí)例代碼

    這篇文章主要介紹了 C++詳解默認(rèn)參數(shù)的構(gòu)造函數(shù)及簡(jiǎn)單實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 雙向鏈表插入刪除基本應(yīng)用介紹

    雙向鏈表插入刪除基本應(yīng)用介紹

    本文將詳細(xì)介紹建立雙向鏈表,實(shí)現(xiàn)對(duì)雙向鏈表的插入,刪除操作,需要了解的朋友可以參考下
    2012-11-11
  • 一篇文章帶你了解C++的KMP算法

    一篇文章帶你了解C++的KMP算法

    這篇文章主要介紹了c++ 實(shí)現(xiàn)KMP算法的示例,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下,希望能給你帶來幫助
    2021-08-08
  • 深度理解C語言中的關(guān)鍵字static

    深度理解C語言中的關(guān)鍵字static

    在C語言中static主要定義全局靜態(tài)變量、定義局部靜態(tài)變量、定義靜態(tài)函數(shù),下面這篇文章主要給大家介紹了關(guān)于C語言中關(guān)鍵字static的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • new和malloc的區(qū)別深入解析

    new和malloc的區(qū)別深入解析

    以下是分別是對(duì)new和malloc的區(qū)別進(jìn)行了詳細(xì)的分析及介紹,需要的朋友可以過來參考下
    2013-09-09
  • 一篇文章帶你了解C++特殊類的設(shè)計(jì)

    一篇文章帶你了解C++特殊類的設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++特殊類的設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++常量指針,指針常量,指向常量的常指針詳解

    C++常量指針,指針常量,指向常量的常指針詳解

    剛接觸到指針時(shí),關(guān)于C++常量指針,指針常量,指向常量的常指針容易混淆,所以整理下,希望能夠幫助自己也幫助到大家
    2021-10-10
  • 一起來了解一下C++中的指針

    一起來了解一下C++中的指針

    這篇文章主要為大家詳細(xì)介紹了C++的指針,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言掃雷游戲的簡(jiǎn)單實(shí)現(xiàn)

    C語言掃雷游戲的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C語言掃雷游戲的簡(jiǎn)單實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論