從彙編看c 函式的預設引數的使用說明

2022-10-04 05:18:07 字數 1165 閱讀 7281

在c++中,可以為函式提供預設引數,這樣,在呼叫函式的時候,如果不提供引數,編譯器將為函式提供引數的預設值。下面從彙編看其原理。

下面是c++原始碼:

複製** **如下:

int add(int a = 1, int b = 2)

int main()

下面是mian函式裡面的彙編碼:

複製** **如下:

; 4    : int main()

xor    eax, eax

mov    esp, ebp

pop    ebp

ret    0

下面是add函式的彙編碼:

複製** **如下:

?add@@yahhh@z proc                    ; add

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

pop    ebp

ret    0

?add@@www.cppcns.comyahhh@z endp

下面是只提供乙個引數值得情況

先看c++原始碼:

複製** **如下:

int add(int a = 1, int b = 2)

int main()

下面是main函式裡面的彙編碼:

複製** **如下:

; 4    : int main()

xor    eax, eax

mov    esp, ebp

pop    ebp

ret    0

可以看到,和上面的不同之處在於沒有為a提供預設的引數值。

下面是add函式的彙編碼,與第一種情況一樣,沒有變化:

複製** **如下:

?add@@yahhh@z proc                    ; add

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

pop    ebp

ret    0

?add@@yahhh@z endp

這裡由於為引數a給出了明確的值,因此編譯器只為引數b提供預設值。可想而知,若為add函式都提供了明確的引數值,那麼編譯器就不會為引數a,b提供預設值了。

本文標題: 從彙編看c++函式的預設引數的使用說明

本文位址:

從彙編看c 的預設operator 操作

在c 中,如果沒有定義operator 操作,編譯器會提供乙個預設的operator 操作。由於operator 操作和拷貝建構函式的功能類似,都執行拷貝操作。因此,編譯器也分提供無用的預設operator 操作和非無用的預設operator 操作。並且什麼時候提供非無用的預設operator 操作...

從彙編code看C 的引用

今日在論壇上看到如下關於引用的code。我一直以為我對於引用很了解,直到膝蓋中了一箭。int val int ref int main 函式的彙編 如下 val函式返回變數i,直接把i放入eax。ref函式返回變數i的引用,把i的位址放入eax。區別和問題 int vv val int int 值傳...

從彙編看c 內聯函式評估求值

在c 中,乙個inline函式實體,在整個class 宣告未被完全看到之前,是不會被評估求值的,也就是說,對於類裡面內聯的成員函式本身的分析,要等到class的宣告完全結束之後才開始。下面試c 原始碼 extern int x 外部宣告的x class x private float x 類自身的成...