我是否违反了严格的别名规则?

Thi*_*awn 12 c++ sse strict-aliasing c++11

我想知道我是否正在使用此代码段破坏严格的别名规则.(我想是这样的,因为它取消引用了一个惩罚指针,但它只在一个表达式中完成而/ Wall不会哭.)

inline double plop() const // member function
{
    __m128d x = _mm_load_pd(v);
    ... // some stuff
    return *(reinterpret_cast<double*>(&x)); // return the lower double in xmm reg referred to by x.
}
Run Code Online (Sandbox Code Playgroud)

如果是,那么解决方法是什么?一旦您想要遵守规范,同时使用不同的表示将成为核心.

谢谢你的回答,我正试图找到一个解决方案.

不接受的答案以及原因:

"use mm_store" - >如果以下指令需要xmm寄存器,则优化器无法将其删除,因此它会在其后生成一个负载.存储+加载什么都没有.

如果对同一对象使用两种类型,则"使用联合" - >别名规则违规.如果我理解Thiago Macieira撰写的文章.

Evg*_*uev 4

只有一个内在函数可以从 xmm 寄存器中“提取”低位双精度值:

double _mm_cvtsd_f64 (__m128d a)
Run Code Online (Sandbox Code Playgroud)

你可以这样使用它:

return _mm_cvtsd_f64(x);
Run Code Online (Sandbox Code Playgroud)

不同的参考文献之间存在一些矛盾。MSDN说:This intrinsic does not map to any specific machine instruction。而Intel内在指南提到了movsd指令。在后一种情况下,优化器很容易消除这个附加指令。至少带有-O2标志的 gcc 4.8.1 会生成没有附加指令的代码。