亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

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

首先是引用情形下的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對應的匯編碼:
復制代碼 代碼如下:

; 6    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 12                    ; 為該調用函數的棧空間預留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            ; 調用add函數,上面的語句已經為傳遞參數做好了準備
    add    esp, 12                    ; 由于剛才為調用函數add傳遞參數進行了壓棧,這里釋放??臻g,即釋放參數
                                ;這就是為什么函數調用完成后局部變量和參數無效的原因,因為他們的空間被釋放了

; 11   :    
; 12   : }

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


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

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

    push    ebp
    mov    ebp, esp

; 2    :     c = a + b;

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

; 3    : }

    pop    ebp
    ret    0


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

下面是指針的情形的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函數對應的匯編碼:
復制代碼 代碼如下:

; 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函數對應的匯編碼:
復制代碼 代碼如下:

; 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


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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲第一| 欧美野外猛男的大粗鳮| 欧美亚洲日本网站| www国产亚洲精品久久网站| 久热精品视频在线免费观看| 亚洲欧美日韩另类| 国产综合香蕉五月婷在线| 色午夜这里只有精品| 国产日产欧美精品| 一区二区三区视频在线| 91精品国产91久久| 亚洲va国产va天堂va久久| 91精品久久久久久久久青青| 国产在线98福利播放视频| 亚洲综合中文字幕在线| 国产精品欧美日韩一区二区| 91在线免费看网站| 91亚洲精品久久久久久久久久久久| 色综合导航网站| zzjj国产精品一区二区| 国产91露脸中文字幕在线| 国产精品海角社区在线观看| 日韩激情第一页| 欧美视频国产精品| 青青久久av北条麻妃海外网| 夜夜狂射影院欧美极品| 国产精品∨欧美精品v日韩精品| 欧美一级免费看| 午夜精品久久久久久久99热浪潮| 丁香五六月婷婷久久激情| 亚洲电影免费观看高清完整版| 亚洲午夜色婷婷在线| 成人两性免费视频| 欧美影院在线播放| 久久精品国产成人| 亚洲第一av网| 欧美三级欧美成人高清www| 欧美精品久久久久久久久久| 欧美性猛交xxxx富婆弯腰| 久久久女女女女999久久| 久久影视三级福利片| 亚洲精选在线观看| 国产一区二区三区在线看| 一区二区欧美在线| 久久久久久一区二区三区| 欧美在线视频免费观看| 久久久久亚洲精品国产| 在线视频免费一区二区| 成人字幕网zmw| 欧美在线观看网址综合| 欧美老妇交乱视频| 中文字幕亚洲综合久久| 久久人人97超碰精品888| 国产精品久久久久久久久影视| 福利二区91精品bt7086| 亚洲a成v人在线观看| 国产精品久久久久久久av电影| 中文字幕日韩av| 亚洲欧美日韩一区二区三区在线| 91精品国产高清久久久久久| 亚洲人成网在线播放| 国产精品电影在线观看| www高清在线视频日韩欧美| 国产综合视频在线观看| 色偷偷av一区二区三区| 日韩电影中文字幕| 国产精品私拍pans大尺度在线| 色偷偷噜噜噜亚洲男人| 亚洲最大的免费| 日本成人激情视频| 麻豆成人在线看| 国产69精品久久久久久| 日韩av网址在线观看| 久久久久国产精品一区| 国产精品久久久久久亚洲影视| 久久久国产精品视频| 欧美日韩国产精品| 成人av电影天堂| 欧美怡红院视频一区二区三区| 亚洲美女又黄又爽在线观看| 国产成人在线一区二区| 久久精品一偷一偷国产| 国产精品高清免费在线观看| 久久成人精品视频| 久久五月情影视| 成人精品久久av网站| 日韩精品视频中文在线观看| 亚洲有声小说3d| 国产91精品最新在线播放| 一区二区av在线| 国产主播喷水一区二区| 一夜七次郎国产精品亚洲| 亚洲天堂男人天堂| 日韩在线视频网| 国产精品视频男人的天堂| 狠狠色狠狠色综合日日小说| 78m国产成人精品视频| 国产精品老牛影院在线观看| 97超级碰在线看视频免费在线看| 永久免费看mv网站入口亚洲| 久久精视频免费在线久久完整在线看| 成人高h视频在线| 综合网日日天干夜夜久久| 激情懂色av一区av二区av| 国产精品高潮视频| 黑人巨大精品欧美一区二区| 久久婷婷国产麻豆91天堂| 国产亚洲欧美另类中文| 日韩中文字幕国产| 欧美激情视频一区| 热门国产精品亚洲第一区在线| 亚洲欧美激情精品一区二区| 国产精品一区久久久| 亚洲成年网站在线观看| 国产成人中文字幕| 欧美日韩国产一区二区三区| 亚洲成**性毛茸茸| 神马国产精品影院av| 久久久久久噜噜噜久久久精品| 亲子乱一区二区三区电影| 亚洲人成绝费网站色www| 欧美激情久久久久久| 亚洲人av在线影院| 亚洲第一天堂av| 精品露脸国产偷人在视频| 欧美韩日一区二区| 日韩中文综合网| 亚洲a一级视频| 夜夜嗨av一区二区三区四区| 欧美在线观看一区二区三区| 欧美日韩亚洲激情| 欧美在线性爱视频| 最新国产精品拍自在线播放| 国产精品久久99久久| 91地址最新发布| 精品国产欧美成人夜夜嗨| 92国产精品久久久久首页| 91九色视频导航| 亚洲经典中文字幕| 久久久噜久噜久久综合| 亚洲美女免费精品视频在线观看| 中文字幕精品一区久久久久| 日本韩国欧美精品大片卡二| 91中文精品字幕在线视频| 日韩在线欧美在线国产在线| 国产亚洲激情在线| 亚洲xxx大片| 最近中文字幕2019免费| 欧美亚洲另类激情另类| 草民午夜欧美限制a级福利片| 亚洲娇小xxxx欧美娇小| 夜夜嗨av一区二区三区免费区| 91久久嫩草影院一区二区| 国产精品69久久久久| 亚洲欧美制服另类日韩| 日韩欧美亚洲成人| 国内精品国产三级国产在线专| 日韩中文av在线| 69视频在线免费观看| 亚洲欧美精品suv| 大量国产精品视频| 欧美性受xxx| 精品久久久久久久久久久久久久| 亚洲日本成人网|