C++ 严格别名和_m128i类型

C++ 严格别名和_m128i类型,c++,c,sse2,C++,C,Sse2,当使用SSE2内部函数执行逐位操作时,必须将指针从int*强制转换为\uu m128i*。此代码是否违反了严格的别名规则 void bit_twiddling_func(int size, int const* input, int* output) { const __m128* x = (const __m128*)input; const __m128* y = (const __m128*)output; for (int i=0; i < size/4;

当使用SSE2内部函数执行逐位操作时,必须将指针从
int*
强制转换为
\uu m128i*
。此代码是否违反了严格的别名规则

void bit_twiddling_func(int size, int const* input, int* output) {
    const __m128* x = (const __m128*)input;
    const __m128* y = (const __m128*)output;

    for (int i=0; i < size/4; ++i, ++x, ++y) {
        __m128i x4 = _mm_load_si128(x); // load 4 integers

        // do some bit twiddling

        _mm_store_si128(y, x4); // store 4 integers
    }
}
void bit_twidling_func(int size,int const*input,int*output){
常量m128*x=(常量m128*)输入;
常量m128*y=(常量m128*)输出;
对于(int i=0;i

谢谢大家!

是;它打破了严格的别名规则。两种不同的类型不能指向内存中的同一位置。这里,x指向输入,y指向输出,但它们的类型不同


您可以将函数的签名更改为采用_m128*参数,但最好不要这样做。如果小心输入/输出参数指向具有适当对齐和大小约束的内存(即,它们应该指向循环未从结尾索引或加载未初始化数据的位置),那么它可能工作得很好。

为什么必须使用
int*
指针?为什么不能让
bit\u twidling\u func
接受
\u m128*
参数?从技术上讲,它只在通过指针实际访问类型时,而不是在创建指针时,才打破严格的别名规则-因此在这种情况下,它将在
\u mm\u load\u si128()技术上它也只在C99中打破了严格的混叠规则。C89和C++没有这样的限制。@比利:C89和C++都有这些限制。@ ZVRBA:那么你能找到一个参考吗?我在我的标准副本中没有看到任何此类限制。“别名”一词仅用于指代命名空间别名。“双关”一词(如类型双关)仅作为“punt”一词的一部分存在。在铸造操作员的讨论中也未提及。以下PDF有引用和参考标准:;相关章节为6.5节。