【问题标题】:Function calling conventions函数调用约定
【发布时间】:2014-07-26 18:38:28
【问题描述】:

我读了一点关于

__crlcall, __stdcall, __fastcall, __vectorcall and __thiscall

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

【问题讨论】:

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


【解决方案1】:

Calling conventions 通常用于使函数调用遵循ABI

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

您无法在 C++ 中指定寄存器的分配/布局方式和其他低级细节(或者您可能可以,但使用特定于编译器的扩展来调整代码会很痛苦):这就是编译器调用的地方约定开始发挥作用。

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

TL;DR:在需要时使用它们。尤其是在处理来自 C 或 C++ 代码的低级细节时。永远不要仅仅为了“让你的代码更漂亮”而使用它们。

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 2011-01-05
    • 2021-12-25
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多