2014-07-26 101 views
3

我讀了一些關於函數調用約定

__crlcall, __stdcall, __fastcall, __vectorcall and __thiscall 

調用轉換。我的問題是,什麼時候使用它們之一是好的以及使用它們的優點(或缺點)。我應該甚至使用它們嗎?

+0

我希望你在msdn上檢查過它。 http://msdn.microsoft.com/en-us/library/984x0h58.aspx – Fyre

+0

可能重複[何時使用調用約定](http://stackoverflow.com/questions/3405022/when-to-use-calling -conventions) – Beed

+0

[MSVC調用約定參考](http://msdn.microsoft.com/en-us/library/k2b2ssfy.aspx)對你來說實際上還不清楚嗎?請詳細說明。簡潔:避免使用便攜式代碼。 –

回答

2

Calling conventions通常用於有一個函數調用堅持ABI

不同體系結構(gpu)的示例:在調用低級別例程(設備函數)時,必須遵守其特定的ABI,例如,您需要確保執行大於1個字節的每個加載在與多個訪問大小對齊的地址上(即,如果您需要訪問一個4字節的整數,則該地址需要以4字節對齊)。

你不能在C++中指定如何分配/佈局寄存器以及其他底層細節(或者你也可以,但是用編譯器特定的擴展來調整代碼會很麻煩):這就是編譯器呼叫約定發揮作用。

關於何時以及是否應該使用它們:如果您不知道自己在做什麼,則最好不要使用它們。無論如何,在x86架構(如__stdcall and __cdecl)上調用約定不匹配(只是在函數調用期間通過的方式是不同的,例如堆棧幀),但通常情況下,如果您運用錯誤的調用約定,則可能會丟失一些性能(並使你的代碼更加便攜)..如果你不走運:CRASH!根據架構,後者可能變得越來越可能。

TL; DR:當你需要它們時使用它們。特別是在處理來自C或C++代碼的低級細節時。千萬別用它們來「讓你的代碼更漂亮」。