gpt4 book ai didi

c++ - 在共享库中使用 fastcall 安全吗?

转载 作者:行者123 更新时间:2023-11-30 02:12:43 24 4
gpt4 key购买 nike

例如,假设我有一个函数可以为您交换 32 位值中的字节:

uint32_t byte_swap(uint32_t in);

好吧,将 32 位值压入堆栈并再次将其弹出似乎很愚蠢,特别是如果我们要经常调用此函数,那么让我们通过 ECX 将其传递进来:

#if __FASTCALL_SUPPORTED_   /* Whatever this may be */
#define FASTCALL __attribute__((fastcall))
#else
#define FASTCALL
#endif

uint32_t FASTCALL byte_swap(uint32_t in);

现在我的问题是,将该函数编译到共享库中以供分发是否安全?如果用户使用不同的编译器来编译他们的程序并针对此链接,该函数是否仍会被正确调用?

最佳答案

__attribute__((fastcall))是 gcc 扩展;因此,如果调用者也没有使用 gcc,它可能无法使用。此外,在您提供的示例中,如果未定义 __FASTCALL_SUPPORTED_,您将以错误的调用约定结束调用 - 想法。

处理此问题的一种方法可能是使用后备包装器。在你的 .c 文件中:

#include "foo.h"

uint32_t FASTCALL byte_swap(uint32_t in) {
/* code ... */
}

uint32_t byte_swap__slowcall(uint32_t in) {
return byte_swap(in);
}

在你的 .h 文件中:

#if __FASTCALL_SUPPORTED_   /* Whatever this may be */
#define FASTCALL __attribute__((fastcall))
#else
#define FASTCALL
#define byte_swap byte_swap__slowcall
#endif

uint32_t FASTCALL byte_swap(uint32_t in);

另请注意,在 Linux 上,<byteswap.h> 中提供了快速字节交换实现。作为bswap_32 .在 x86 机器上,它将向下编译为内联汇编程序,并且在足够高的情况下使用单条指令 -march=设置。

关于c++ - 在共享库中使用 fastcall 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1484543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com