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

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

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

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

下面是c++源碼:

復制代碼 代碼如下:

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

}

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

; 4    : int main() {

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

; 5    :    int c= add();

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

; 6    :   
; 7    : }

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


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

?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


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

先看c++源碼:

復制代碼 代碼如下:

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

}

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

; 4    : int main() {

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

; 5    :    int a = 3;

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

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

    push    2;將2壓棧,提供b參數(shù)默認值
    mov    eax, DWORD PTR _a$[ebp];取出a的值,放入寄存器eax里面
    push    eax;將eax里面的值壓棧,提供參數(shù)a的值,這里不是提供的默認值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所在存儲空間里面

; 7    :   
; 8    : }

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


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

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

復制代碼 代碼如下:

?add@@YAHHH@Z PROC                    ; add

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

    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提供默認值??上攵魹閍dd函數(shù)都提供了明確的參數(shù)值,那么編譯器就不會為參數(shù)a,b提供默認值了。

相關(guān)文章

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

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

    動態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語言中動態(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ù)使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)

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

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

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

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

    c語言多進程tcp服務器示例

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

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

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

    Qt中互斥鎖QMutex和QMutexLocker的使用

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

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

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

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

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

    C 語言條件運算符詳細講解

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

最新評論