從匯編看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++中類的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說明
這篇文章主要介紹了C++中類的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)
這里給大家分享的事一則C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)的代碼,取材自《C++程序設計》(梁勇著第三版367頁),有需要的小伙伴可以參考下2016-05-05