在共享库中使用fastcall是否安全?

时间:2009-09-27 21:34:37

标签: c++ gcc shared

例如,假设我有一个函数可以为您交换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);

现在我的问题是,将该函数编译到共享库以进行分发是否安全?如果用户使用不同的编译器来编译他们的程序并链接到这个,那么该函数是否仍然可以被正确调用?

1 个答案:

答案 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}}设置的单个指令。