最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

復制代碼 代碼如下:

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對應(yīng)的匯編碼:
復制代碼 代碼如下:

; 6    : int main() {

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

; 7    :     int a = 1;

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

; 8    :     int b = 2;

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

; 9    :     int c = 0;

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

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

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

; 11   :    
; 12   : }

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


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

; 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所在存儲單元

; 3    : }

    pop    ebp
    ret    0


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

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

復制代碼 代碼如下:

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ù)對應(yīng)的匯編碼:
復制代碼 代碼如下:

; 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ù)對應(yīng)的匯編碼:
復制代碼 代碼如下:

; 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語言函數(shù)封裝及變量的作用域

    C語言函數(shù)封裝及變量的作用域

    這篇文章主要介紹了C語言函數(shù)封裝及變量的作用域,以及分享一些字符串的相關(guān)實戰(zhàn)練習,字符串轉(zhuǎn)整數(shù)、整數(shù)轉(zhuǎn)字符串、浮點數(shù)轉(zhuǎn)字符串、字符串轉(zhuǎn)浮點數(shù)、判斷平年閏年、技術(shù)字符串長度等等。下文詳細內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • C++重載輸入和輸出運算符詳解

    C++重載輸入和輸出運算符詳解

    在C++中,標準庫本身已經(jīng)對左移運算符<<和右移運算符>>分別進行了重載,使其能夠用于不同數(shù)據(jù)的輸入輸出,本節(jié)以前面的?complex?類為例來演示輸入輸出運算符的重載,需要的朋友可以參考下
    2023-09-09
  • C++實現(xiàn)LeetCode(84.直方圖中最大的矩形)

    C++實現(xiàn)LeetCode(84.直方圖中最大的矩形)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(84.直方圖中最大的矩形),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++中stack、queue、vector的用法詳解

    C++中stack、queue、vector的用法詳解

    本文通過實例代碼給大家介紹了C++中stack、queue、vector的用法,需要的朋友參考下吧
    2017-08-08
  • C 讀取ini文件的實例詳解

    C 讀取ini文件的實例詳解

    這篇文章主要介紹了C 讀取ini文件的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • Clion2020.2.x最新激活碼破解版附安裝教程(Mac Linux Windows)

    Clion2020.2.x最新激活碼破解版附安裝教程(Mac Linux Windows)

    Clion2020增加了很多新特性,修復了大量bug,大大提高了開發(fā)效率。這篇文章主要介紹了Clion2020.2.x最新激活碼破解版附安裝教程(Mac Linux Windows),需要的朋友可以參考下
    2020-11-11
  • C++與Lua協(xié)程交互的示例詳解

    C++與Lua協(xié)程交互的示例詳解

    Lua 語言不支持真正的多線程,即不支持共享內(nèi)存的搶占式線程,在執(zhí)行協(xié)程體的 Lua 腳本時,Lua 同樣可以調(diào)用 C++ 的函數(shù),本文給大家介紹了C++ 與 Lua 的協(xié)程交互,需要的朋友可以參考下
    2024-02-02
  • C語言實現(xiàn)職工管理系統(tǒng)

    C語言實現(xiàn)職工管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C語言中操作密碼文件的一些函數(shù)總結(jié)

    C語言中操作密碼文件的一些函數(shù)總結(jié)

    這篇文章主要介紹了C語言中操作密碼文件的一些函數(shù)總結(jié),包括setpwent()函數(shù)和getpwent()函數(shù)以及endpwent()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C語言詳細分析講解流程控制語句用法

    C語言詳細分析講解流程控制語句用法

    C語言語句的執(zhí)行默認順序執(zhí)行(從上往下依次執(zhí)行),編程語言一般除了默認的順序執(zhí)行以外,還提供分支執(zhí)行和循環(huán)執(zhí)行的語法,讓我們一起來看看
    2022-05-05

最新評論

望谟县| 宜都市| 德钦县| 营山县| 望奎县| 若羌县| 阿瓦提县| 太湖县| 永州市| 石屏县| 任丘市| 沿河| 大兴区| 潍坊市| 温宿县| 瑞安市| 靖边县| 威海市| 观塘区| 武冈市| 临清市| 浪卡子县| 肇州县| 航空| 苍溪县| 孟津县| 小金县| 营山县| 中西区| 连平县| 南城县| 嘉兴市| 当雄县| 增城市| 卢氏县| 婺源县| 商都县| 芮城县| 安福县| 阳江市| 竹山县|