c++ - 当我真的不关心调用约定时,我是否应该更喜欢 "default"调用约定而不是 __fastcall?

标签 c++ windows visual-c++ com calling-convention

我们有一个庞大的 C++ 代码库,其中包含大量 COM 对象。暴露给 COM 的每个函数都必须有 __stdcall 调用约定(通常是 STDMETHODCALLTYPE 宏),因此我们有很多标记为 STDMETHODCALLTYPE 的函数。

现在我看到一个函数不是通过 COM 直接调用的,而是仅从我们的 C++ 代码中调用的,并且该函数的签名中也有 STDMETHODCALLTYPE 宏。我完全确定宏在那里毫无用处 - 从未发生过通过 COM 调用该函数的情况。

我是否应该删除 __stdcall 以便它成为“默认”调用约定函数?我如何做出这样的决定?

最佳答案

我的方法是对内部代码使用默认的编译器调用约定,并对跨模块边界导出的任何方法使用明确定义的调用约定。

出于性能原因,大多数编译器的默认调用约定充分利用了寄存器,因此在适当的地方使用它是有好处的。它还使您的代码看起来更容易,因为您无需指定约定即可获得默认值。

对于导出的函数,您显然需要指定约定。如果您正在制作一个您预计会从 C 或 C++ 以外的语言调用的库,那么通常使用 stdcall。如果您只期望 C 或 C++ 客户端,那么 cdecl 可能是最常见的约定。

关于c++ - 当我真的不关心调用约定时,我是否应该更喜欢 "default"调用约定而不是 __fastcall?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5870566/

相关文章:

c++ - 对类型的非常量左值引用无法绑定(bind)错误

c++ - 明确默认的构造函数和成员变量的初始化

c++ - 如何在没有安装 Qt 本身的情况下运行 Qt 程序?

python - 如何在 Tkinter 中使用 "native"GUI 外观?

c++ - 如何在 C++ 中将 "new"用于多边形

c++ - 为什么我需要为静态库构建指定运行时库类型?

c++ - 我需要调用 CloseHandle 吗?

C++ STL 使用一组指针访问类的成员

c++ - luabind 没有启动我定义的功能

python-3.x - 如何使用具有管理员权限的子进程停止和启动 Windows 服务?