函数调用约定



我读了一些关于

的内容
__crlcall, __stdcall, __fastcall, __vectorcall and __thiscall

调用转换。我的问题是,什么时候使用它们是好的,使用它们的优点(或缺点)是什么。我应该使用它们吗?

调用约定通常用于使函数调用遵循ABI。

一个不同架构(gpu)的例子:当调用低级CUDA例程(设备函数)时,你必须遵守它们特定的ABI,例如,你需要确保每个大于1字节的负载都在与访问大小的倍数对齐的地址上执行(即,如果你需要访问一个4字节的整数,该地址需要与4字节对齐)。

你不能在c++中指定寄存器是如何分配/布局和其他底层细节的(或者你可以,但是用编译器特定的扩展来调整代码会很痛苦):这就是编译器调用约定发挥作用的地方。

关于何时以及是否应该使用它们:如果你不知道自己在做什么,最好不要使用它们。在x86架构上不匹配调用约定,比如__stdcall和__cdecl,无论如何都可以工作(只是在函数调用期间传递的方式不同,例如堆栈帧),但通常如果你使用错误的调用约定,如果你幸运的话,你可能会失去一些性能(并使你的代码不那么可移植)。如果你不走运:CRASH!根据体系结构的不同,后者的可能性越来越大。

TL;DR:需要时使用它们。特别是在处理C或c++代码的底层细节时。不要仅仅为了"使你的代码更漂亮"而使用它们。

最新更新