例如,假设我有一个函数可以为您交换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);
现在我的问题是,将该函数编译到共享库以进行分发是否安全?如果用户使用不同的编译器来编译他们的程序并链接到这个,那么该函数是否仍然可以被正确调用?
答案 0 :(得分:4)
__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
提供了快速字节换行实现。-march=
。在x86机器上,它将编译为内联汇编程序,以及足够{{1}}设置的单个指令。