在c++中,乙個inline函式實體,在整個class 宣告未被完全看到之前,是不會被評估求值的,也就是說,對於類裡面內聯的成員函式本身的分析,要等到class的宣告完全結束之後才開始。
下面試c++原始碼:
externint 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 值傳...