静态与外部内在函数
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)的预期行为。
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)的预期行为。