静态与外部内在函数

Static vs. external intrinsics

Clang 6.0.1 avxintrin.h 有声明:

static __inline __m256i __DEFAULT_FN_ATTRS _mm256_set1_epi32(int)

GCC 5.5 有:

extern __inline __m256i __attribute__((__gnu_inline__, _always_inline__, __artificial__)) _mm256_set1_epi32(int)

为什么一个是 extern 而另一个是 static 这是在 inline 调用 [=] 的函数中为我显示的17=]。 Clang 希望它被声明为 static:

#include <immintrin.h>

inline void SimdBlockBloomFilter_make_mask() {
  _mm256_set1_epi32(1);
}

-Weverything:

warning: static function '_mm256_set1_epi32' is used in an inline
function with external linkage [-Wstatic-in-inline]

使用 Clang++ 编译时不会出现此错误。

在 GCC 版本中,gnu_inline attribute 与 C99 及更高版本中的 static inline 的行为接近。

C 委员会在重新定义 extern inline 的含义时忽略了 GNU 的先例:对于 GNU 编译器,extern inline 意味着编译器永远不应生成函数的 non-inline 副本(即使它的地址被占用)。在 C99 中,extern inline 表示一个翻译单元中的定义完成另一个翻译单元中的 inline 定义。

<immintrin.h> 的 GCC 版本使用 gnu_inline 属性来获得所有编译器模式(特别是 C89/C90 和 C99)的预期行为。