函数调用约定

时间:2014-07-26 18:38:28

标签: c++ visual-studio-2012 calling-convention

我读了一下

__crlcall, __stdcall, __fastcall, __vectorcall and __thiscall

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

1 个答案:

答案 0 :(得分:2)

Calling conventions通常用于将函数调用附加到ABI

具有不同体系结构(gpu)的示例:在调用低级CUDA例程(设备函数)时,您必须遵守其特定的ABI,例如,您需要确保每个负载大于1字节在与访问大小的倍数对齐的地址上执行(即,如果需要访问4字节整数,则该地址需要4字节对齐)。

你不能在C ++中指定如何分配/布局寄存器以及其他低级细节(或者你可以,但是用编译器特定的扩展来调整你的代码会很痛苦):那个&#39 ; s编译器调用约定发挥作用。

关于何时以及是否应该使用它们:如果您不知道自己在做什么,最好不要使用它们。像__stdcall and __cdecl这样的x86体系结构上的调用约定不匹配可能会起作用(函数调用期间事物的传递方式是不同的,例如堆栈帧),但一般情况下,如果你使用错误的调用约定幸运的是,你可能会失去一些表演(并使你的代码不那么便携)..如果你不幸运: CRASH !根据架构,后者可能变得越来越有可能。

TL; DR:在您需要时使用它们。特别是在处理来自C或C ++代码的低级细节时。不要只是为了让你的代码变得更漂亮而使用它们。#/ p>