從匯編看c++函數(shù)的默認(rèn)參數(shù)的使用說明
在c++中,可以為函數(shù)提供默認(rèn)參數(shù),這樣,在調(diào)用函數(shù)的時(shí)候,如果不提供參數(shù),編譯器將為函數(shù)提供參數(shù)的默認(rèn)值。下面從匯編看其原理。
下面是c++源碼:
int add(int a = 1, int b = 2) {//參數(shù)a b有默認(rèn)值
return a + b;
}
int main() {
int c= add();//不提供參數(shù)
}
下面是mian函數(shù)里面的匯編碼:
; 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ù)的匯編碼:
?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++源碼:
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ù)里面的匯編碼:
; 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ù)的匯編碼,與第一種情況一樣,沒有變化:
?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)值??上攵魹閍dd函數(shù)都提供了明確的參數(shù)值,那么編譯器就不會(huì)為參數(shù)a,b提供默認(rèn)值了。
相關(guān)文章
教你用Matlab制作立體動(dòng)態(tài)相冊(cè)
沒想到吧,MATLAB竟也能制作3D相冊(cè)!本文將為大家詳細(xì)介紹Matlab制作立體動(dòng)態(tài)相冊(cè)的方法步驟,感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-03-03
C語言函數(shù)傳遞數(shù)組和傳遞地址的區(qū)別你知道嗎
這篇文章主要介紹了C語言中數(shù)組作為函數(shù)的參數(shù)以及返回值的使用簡(jiǎn)單入門,這里以一維數(shù)組作為基本條件進(jìn)行例子講解,需要的朋友可以參考下2021-09-09
C++自定義封裝socket操作業(yè)務(wù)類完整實(shí)例
這篇文章主要介紹了C++自定義封裝socket操作業(yè)務(wù)類,結(jié)合完整實(shí)例形式分析了Linux環(huán)境下C++操作socket的封裝業(yè)務(wù)類,可實(shí)現(xiàn)基本的socket連接、參數(shù)設(shè)置、發(fā)送請(qǐng)求等基本功能,需要的朋友可以參考下2017-08-08
C++中typedef 及其與struct的結(jié)合使用
這篇文章主要介紹了C++中typedef 及其與struct的結(jié)合使用,需要的朋友可以參考下2014-02-02
C++中線性代數(shù)計(jì)算Eigen庫(kù)的使用教程詳解
Eigen是一個(gè)基于線性代數(shù)的C++模板庫(kù),主要用于矩陣、向量、數(shù)值求解和相關(guān)算法,本文主要為大家簡(jiǎn)單聊聊Eigen庫(kù)的使用,希望對(duì)大家有所幫助2023-12-12

