繁体   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