亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

從匯編看c++函數(shù)的默認(rèn)參數(shù)的使用說明

 更新時(shí)間:2013年05月07日 10:23:19   作者:  
本篇文章介紹了,在c++中函數(shù)的默認(rèn)參數(shù)的使用說明分析。需要的朋友參考下

在c++中,可以為函數(shù)提供默認(rèn)參數(shù),這樣,在調(diào)用函數(shù)的時(shí)候,如果不提供參數(shù),編譯器將為函數(shù)提供參數(shù)的默認(rèn)值。下面從匯編看其原理。

下面是c++源碼:

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

int add(int a = 1, int b = 2) {//參數(shù)a b有默認(rèn)值
    return a + b;
}
int main() {
   int c= add();//不提供參數(shù)

}

下面是mian函數(shù)里面的匯編碼:
復(fù)制代碼 代碼如下:

; 4    : int main() {

    push    ebp
    mov    ebp, esp
    push    ecx;為局部變量c分配了4字節(jié)的存儲(chǔ)空間 ecx為32位寄存器

; 5    :    int c= add();

    push    2;將2壓棧,就是add函數(shù)中b參數(shù)的默認(rèn)值 這里參數(shù)壓棧方向是從右向左
    push    1;將1壓棧,就是add函數(shù)中a參數(shù)的默認(rèn)值
    call    ?add@@YAHHH@Z                ; 調(diào)用add函數(shù)
    add    esp, 8;釋放剛才為add提供參數(shù)時(shí)的儲(chǔ)存空間
    mov    DWORD PTR _c$[ebp], eax;eax寄存器里面存放add函數(shù)返回值,寫入變量c里面

; 6    :   
; 7    : }

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


下面是add函數(shù)的匯編碼:
復(fù)制代碼 代碼如下:

?add@@YAHHH@Z PROC                    ; add

; 1    : int add(int a = 1, int b = 2) {

    push    ebp
    mov    ebp, esp

; 2    :     return a + b;

    mov    eax, DWORD PTR _a$[ebp];將參數(shù)a的值寫入寄存器eax
    add    eax, DWORD PTR _b$[ebp];將參數(shù)b的值取出與eax里面的值相加,結(jié)果存入eax寄存器

; 3    : }

    pop    ebp
    ret    0
?add@@YAHHH@Z ENDP


下面是只提供一個(gè)參數(shù)值得情況

先看c++源碼:

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

int add(int a = 1, int b = 2) {//參數(shù)a b有默認(rèn)值
    return a + b;
}
int main() {
   int a = 3;
   int c= add(a);//只為a提供參數(shù)

}

下面是main函數(shù)里面的匯編碼:
復(fù)制代碼 代碼如下:

; 4    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 8;esp寄存器作為棧指針移動(dòng)8字節(jié),為局部變量a,c預(yù)留存儲(chǔ)空間

; 5    :    int a = 3;

    mov    DWORD PTR _a$[ebp], 3;將3寫入局部變量a所在存儲(chǔ)空間

; 6    :    int c= add(a);//不提供參數(shù)

    push    2;將2壓棧,提供b參數(shù)默認(rèn)值
    mov    eax, DWORD PTR _a$[ebp];取出a的值,放入寄存器eax里面
    push    eax;將eax里面的值壓棧,提供參數(shù)a的值,這里不是提供的默認(rèn)值1
    call    ?add@@YAHHH@Z                ; 調(diào)用add函數(shù)
    add    esp, 8;釋放剛才為調(diào)用函數(shù)add為參數(shù)分配的8byte空間
    mov    DWORD PTR _c$[ebp], eax;eax里面存放調(diào)用函數(shù)的結(jié)果,寫到c所在存儲(chǔ)空間里面

; 7    :   
; 8    : }

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


可以看到,和上面的不同之處在于沒有為a提供默認(rèn)的參數(shù)值。

下面是add函數(shù)的匯編碼,與第一種情況一樣,沒有變化:

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

?add@@YAHHH@Z PROC                    ; add

; 1    : int add(int a = 1, int b = 2) {//參數(shù)a b有默認(rèn)值

    push    ebp
    mov    ebp, esp

; 2    :     return a + b;

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

; 3    : }

    pop    ebp
    ret    0
?add@@YAHHH@Z ENDP


這里由于為參數(shù)a給出了明確的值,因此編譯器只為參數(shù)b提供默認(rèn)值。可想而知,若為add函數(shù)都提供了明確的參數(shù)值,那么編譯器就不會(huì)為參數(shù)a,b提供默認(rèn)值了。

相關(guān)文章

  • C語言?動(dòng)態(tài)內(nèi)存管理全面解析

    C語言?動(dòng)態(tài)內(nèi)存管理全面解析

    動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語言中動(dòng)態(tài)內(nèi)存的管理
    2022-02-02
  • C++中類的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說明

    C++中類的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說明

    這篇文章主要介紹了C++中類的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++實(shí)現(xiàn)將數(shù)組中的值反轉(zhuǎn)

    C++實(shí)現(xiàn)將數(shù)組中的值反轉(zhuǎn)

    這里給大家分享的事一則C++實(shí)現(xiàn)將數(shù)組中的值反轉(zhuǎn)的代碼,取材自《C++程序設(shè)計(jì)》(梁勇著第三版367頁),有需要的小伙伴可以參考下
    2016-05-05
  • c++ vector模擬實(shí)現(xiàn)代碼

    c++ vector模擬實(shí)現(xiàn)代碼

    vector是C++ STL中一個(gè)非常重要的容器,了解 vector 的底層實(shí)現(xiàn)原理,可以很好的幫助我們更加熟練的使用vector。這篇文章通過實(shí)例代碼給大家介紹c++ vector模擬實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2020-02-02
  • c語言多進(jìn)程tcp服務(wù)器示例

    c語言多進(jìn)程tcp服務(wù)器示例

    這篇文章主要介紹了c語言多進(jìn)程tcp服務(wù)器示例,多進(jìn)程socket,epoll實(shí)現(xiàn)IO復(fù)用,需要的朋友可以參考下
    2014-03-03
  • C++中memset函數(shù)用法詳解

    C++中memset函數(shù)用法詳解

    這篇文章主要介紹了C++中memset函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了memset函數(shù)的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-06-06
  • Qt中互斥鎖QMutex和QMutexLocker的使用

    Qt中互斥鎖QMutex和QMutexLocker的使用

    本文主要介紹了Qt中互斥鎖QMutex和QMutexLocker的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • C語言PlaySound函數(shù)使用方法

    C語言PlaySound函數(shù)使用方法

    這篇文章介紹了C語言PlaySound函數(shù)的使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • C++關(guān)鍵字typename的深入理解

    C++關(guān)鍵字typename的深入理解

    本篇文章是對(duì)C++中的關(guān)鍵字typename進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C 語言條件運(yùn)算符詳細(xì)講解

    C 語言條件運(yùn)算符詳細(xì)講解

    本文主要介紹C語言中的條件運(yùn)算符,并提供示例代碼以便大家學(xué)習(xí)參考,希望能幫助學(xué)習(xí) C語言的同學(xué)
    2016-07-07

最新評(píng)論