簡體   English   中英

函數調用約定

[英]Function calling conventions

我讀了一點關於

__crlcall, __stdcall, __fastcall, __vectorcall and __thiscall

調用轉換。 我的問題是,什么時候使用其中之一比較好,使用它們的優點(或缺點)是什么。 我應該使用它們嗎?

調用約定通常用於使函數調用遵循ABI

具有不同架構(GPU)的示例:在調用低級CUDA例程(設備函數)時,您必須遵守其特定的 ABI,例如,您需要確保每個大於 1 字節的加載都在對齊的地址上執行到訪問大小的倍數(即,如果您需要訪問 4 字節整數,該地址需要 4 字節對齊)。

您無法在 C++ 中指定如何分配/布局寄存器和其他低級細節(或者您可以,但使用特定於編譯器的擴展來調整您的代碼會很痛苦):這就是編譯器調用約定的用武之地玩。

關於何時以及是否應該使用它們:如果您不知道自己在做什么,則最好根本不要使用它們。 不匹配像__stdcall 和 __cdecl這樣的 x86 架構上的調用約定無論如何都可以工作(只是在函數調用過程中傳遞的東西是不同的,例如堆棧幀)但一般來說,如果您使用錯誤的調用約定,如果幸運的話,您可能只是失去一些性能(並使您的代碼不那么可移植)..如果你不走運:崩潰 根據架構,后者可能變得越來越可能。

TL;DR:在需要時使用它們。 特別是在處理來自 C 或 C++ 代碼的低級細節時。 不要僅僅為了“讓你的代碼更漂亮”而使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM