C++ 这个联合会打破严格的别名吗?浮点寄存器呢

C++ 这个联合会打破严格的别名吗?浮点寄存器呢,c++,gcc,unions,floating,strict-aliasing,C++,Gcc,Unions,Floating,Strict Aliasing,我必须使用这个联合来实现IEEE的一个小技巧,这会打破严格的别名吗?GCC没有抛出任何警告(使用GCC4.5和4.6尝试过,即使是学究式的严格别名,但据我所知,GCC不太擅长捕捉严格别名规则违规(大量误报/否定) 这就是我目前正在使用的代码段,它似乎在没有任何警告的情况下正常工作,但可能会有副作用或某些编译器优化的未定义行为。因此,如果该代码段在某些情况下可能不安全,我将努力删除它 我还假设这段代码需要在大多数现代CPU上将数据从标准寄存器移动到浮点寄存器(对此我很好奇),这涉及到一些与旧CPU

我必须使用这个联合来实现IEEE的一个小技巧,这会打破严格的别名吗?GCC没有抛出任何警告(使用GCC4.5和4.6尝试过,即使是学究式的严格别名,但据我所知,GCC不太擅长捕捉严格别名规则违规(大量误报/否定)

这就是我目前正在使用的代码段,它似乎在没有任何警告的情况下正常工作,但可能会有副作用或某些编译器优化的未定义行为。因此,如果该代码段在某些情况下可能不安全,我将努力删除它

我还假设这段代码需要在大多数现代CPU上将数据从标准寄存器移动到浮点寄存器(对此我很好奇),这涉及到一些与旧CPU相关的额外周期,对吗

上面的代码并不打算进行优化,所以请不要因为滥用优化而贬低我,上面的代码是我获得某个结果的最简单的方法(幸运的是,最简单的方法似乎在我的情况下也是最快的!),如果结果不安全,那么我将使用较慢的方法


提前感谢

它是UB(但不需要严格的别名)另外,联合/<代码> d数据总是通过实现存储在内存中,否则,需要知道源数据来自哪个寄存器,即知道源类型。

混叠在C中定义,但在C++中有未定义的行为;未定义的行为等价于读取时发生的行为。未初始化的变量(左值到右值的转换)

因此,这种情况最有可能出现的情况是,优化程序决定消除从union读取的数据,因为它没有定义的值。但是,大多数C和C++编译器可能会为您提供C行为,因为它们无论如何都需要支持这种行为


别名值的安全方法是通过字节复制,例如
std::memcpy
std::copy(重新解释转换(…),…)或者,如果你可以在C和C++中编译你的项目,你可以把联合别名代码移到C源文件中,并把它作为C.< /P>编译。你确定比特拷贝是标准编译吗?技术上你会先读<代码>浮点< /Code >作为<代码> char [4 ] < /Code >(这是OK),然后写一个<代码> char(4)。
在RHS的内存位置,然后使用别名
char[4]
as
int
,这是严格的别名规则所不允许的。@3.9p2中描述了向
char
数组的Kos字节复制,3.9p3中描述了直接字节复制,因此这不会违反别名。需要注意的是,该标准仅涵盖具有相同类型的源和目标。
union
{
    Uint32 Integer;
    Float32 Real;
} Field;    
Field A;
A.Integer = (Value1 & B) || Value2;
return A.Real;