如果在函数中我需要一个固定的随机模板,我应该将其设置为const
还是static const
?
const __m128i SHUFFLE_MASK = _mm_setr_epi8(0, 4, 8, 12, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1);
static const __m128i SHUFFLE_MASK = _mm_setr_epi8(0, 4, 8, 12, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1);
答案 0 :(得分:1)
通常_mm_setr_epi8
编译时常量数据最终会编译为16B块的只读数据(被加载(或用作内存操作数))。 (在.LC0
asm输出中查找gcc -S
之类的标签。这已经是最佳的了。
static const
最终可能会包含检查静态位置是否已初始化的代码。由于没有任何好处和可能的成本(至少在较旧的gcc上没有检查过自己),因此请避免使用static const
向量(特别是当声明和初始化程序在函数内时)。
IDK,如果gcc将具有数据模式的setr
优化为movd
并随机播放,或类似的东西。如果是这样,那么您可能希望避免使用指令生成常量,而不是将其作为内存操作数。
但这似乎是一个非常不可能的案例。但是如果你需要打败这样的优化,你可以使用静态(文件范围)char
数组来保存你的常量,并将指针转换为矢量类型。