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

2021-08-21 21:20:43 字數 1254 閱讀 2130

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

下面試c++原始碼:

extern

int x;//

外部宣告的x

class

x private

:

float x;//

類自身的成員變數x

};int

main()

依據上面的規則,內聯函式getx繫結的將會是成員變數x(float型)

下面我們只看成員函式getx的彙編碼:

?getx@x@@qbemxz proc                    ;

x::getx, comdat

;_this$ = ecx

;5 : float getx() const

movesp, ebp

popebp

ret0

?getx@x@@qbemxz endp

但是,這種規則對於成員函式的引數卻不是這樣。

下面是c++原始碼:

typedef int length;//

全域性class

x private

: typedef

float length;//

類成員length i;

};int

main()

下面通過彙編碼看成員變數i和成員函式seti的引數x到底是什麼型別

下面是mian函式彙編碼:

;

13 : int main()

xoreax, eax

movesp, ebp

popebp

ret0

_main endp

下面是seti函式的彙編碼:

?seti@x@@qaexh@z proc                    ;

x::seti, comdat

;_this$ = ecx

;5 : void seti(length x)

movesp, ebp

popebp

ret4

?seti@x@@qaexh@z endp

通過彙編碼可以看到,成員函式seti的引數型別在第一次遇見就繫結了型別。

從彙編看函式呼叫

首先介紹幾個名詞 棧幀 也叫過程活動記錄,是編譯器用來實現過程 函式呼叫的一種資料結構。棧幀中儲存了該函式的返回位址和區域性變數。暫存器 cpu內部用來存放資料的一些小型儲存區域,用來暫時存放參與運算的資料和運算結果。常用的暫存器有 esp 棧指標暫存器 extended stack pointer...

從彙編看c 中成員函式指標 一

下面先來看c 的原始碼 include using namespace std class x virtual intget2 virtual intget3 int main 類x有3個成員函式,其中get1是普通的成員函式,而get2和get3都分別是虛成員函式。在main函式裡面分別定義了指向...

從彙編code看C 的引用

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