2014-07-26 113 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++代码的低级细节时。千万别用它们来“让你的代码更漂亮”。