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

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

 更新時(shí)間:2013年05月06日 10:37:22   作者:  
在c++中,引用和指針具有相同的作用,都可以用來(lái)在函數(shù)里面給變函數(shù)外面對(duì)象或者變量的值,下面就來(lá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);

}


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

; 6    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 12                    ; 為該調(diào)用函數(shù)的??臻g預(yù)留12byte,用來(lái)存儲(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ǔ)了原來(lái)局部變量a,b,c的值,只不過(guò)對(duì)于c來(lái)說(shuō),存儲(chǔ)的是c存儲(chǔ)空間的偏移地址
    ;因此,對(duì)于a,b來(lái)說(shuō),也就是將他們的值得一份拷貝存了起來(lái),也就是傳值;而c只是存儲(chǔ)了自己存儲(chǔ)空間的偏移地址,也就是傳地址
    call    ?add@@YAXHHAAH@Z            ; 調(diào)用add函數(shù),上面的語(yǔ)句已經(jīng)為傳遞參數(shù)做好了準(zhǔn)備
    add    esp, 12                    ; 由于剛才為調(diào)用函數(shù)add傳遞參數(shù)進(jìn)行了壓棧,這里釋放??臻g,即釋放參數(shù)
                                ;這就是為什么函數(shù)調(diào)用完成后局部變量和參數(shù)無(wú)效的原因,因?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語(yǔ)言函數(shù)封裝及變量的作用域

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

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

    C++重載輸入和輸出運(yùn)算符詳解

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

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

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

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

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

    C 讀取ini文件的實(shí)例詳解

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

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

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

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

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

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

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

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

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

    C語(yǔ)言詳細(xì)分析講解流程控制語(yǔ)句用法

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

最新評(píng)論

北安市| 松潘县| 美姑县| 连云港市| 沙坪坝区| 新安县| 扶绥县| 湖南省| 儋州市| 莱西市| 清远市| 望城县| 长兴县| 海盐县| 晋中市| 时尚| 城固县| 和田县| 景泰县| 汪清县| 抚顺县| 伊宁县| 阳新县| 交城县| 若尔盖县| 上高县| 东山县| 同心县| 嘉禾县| 安新县| 白玉县| 万荣县| 大英县| 峨边| 武宁县| 民勤县| 温州市| 长宁县| 沁源县| 浠水县| 阿合奇县|