c++編譯器常用的宏

今天,在學習IOCP的時候,突然發現對c++編譯器的一些常用的宏比較陌生,就稍微學習了一下。

ps:在vs 2005環境下,打開“Project → Project Settings”,選擇 C/C++ 選項卡,在“Category”欄選擇“Listing Files”然後在Listing file type欄選擇“Assembly with Machine Code”。重新編譯工程後則可以在輸出目錄看到與每一個.cpp文件同名的.cod文件

1、幾種函數調用的聲明方式

example:

 

_cdecl:全稱爲c declaration。這是c 默認的函數調用的方式,調用這樣的函數時,所有參數從右向左壓棧,由調用者進行清棧,調用函數時,可以不明確參數的個數和類型,c++編譯器將不檢查這樣的不確定性,像printf和scanf就必須使用這種調用方式。

使用int _cdecl maxInt(int x,int y)聲明方式編譯後的彙編代碼如下(關鍵看壓棧和返回階段):

 

 

調用者的彙編代碼:

 

 

 

由此,可以看出,所有參數是從右向左壓棧,並且由調用者清理棧。

 

 

_stdcall:全稱爲Standard Call。是c++標準的調用方式,所有參數從右向左壓棧,this指針最後壓棧,被調用者自己清理棧,必須確定參數的個數和類型,調用者不能傳遞過多或者過少的參數。

使用int _stdcall maxInt(int x,int y)聲明方式編譯後的彙編代碼如下:

 

調用函數時的彙編代碼:

 

由此可以看出,參數是從右向左壓棧,而且由被調用者自己清理棧。

_fastcall:快速調用,由於一般函數的參數個數都很好,所以使用這個方式可以把前面幾個(一般是兩個)參數直接放到寄存器中,其餘參數依然通過棧來傳遞,節省壓棧退棧時間,實現快速調用,返回方式和_stdcall一樣。

使用int _fastcall maxInt(int x,int y)調用方式編譯後的彙編代碼如下:

 

調用該函數的彙編代碼如下:

 

由此可以看出,調用函數時,不用壓棧,被調用函數返回時,不用退棧。

__thiscall:這種調用方式是爲了解決成員函數中this指針的傳遞而設置的,this指針被放在特定的寄存器中,這個特定的寄存器在不同的編譯器中式不一樣的,它只能用在c++類成員函數的調用方式,返回方式與_stdcall相當。

把example修改後如下:

 

修改後,maxInt編譯後的彙編代碼如下:

 

調用該函數時的彙編代碼如下:

 

由此可以看出,在vs 2005下,使用ecx來傳遞this指針。

(未完待續)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章