【发布时间】:2012-09-06 09:32:13
【问题描述】:
union
{
Uint32 Integer;
Float32 Real;
} Field;
我必须使用那个联合来实现一点 IEEE 技巧,这会破坏严格的别名吗? GCC 没有发出任何警告(尝试使用 GCC 4.5 和 4.6,即使使用迂腐的严格别名,但据我所知,GCC 并不能很好地捕捉严格的别名规则违规行为(大量误报/误报)。
Field A;
A.Integer = (Value1 & B) || Value2;
return A.Real;
这是我目前使用的 sn-p,它似乎可以正常工作而没有任何警告,但某些编译器优化可能会产生副作用或未定义的行为。所以如果那段代码在某些情况下可能是不安全的,我会努力删除它。
我还假设这段代码需要将数据从标准寄存器移动到大多数现代 CPU 上的浮点寄存器(只是好奇),这涉及到一些与旧 CPU 相关的额外周期,对吗?
上面的代码不是为了优化,所以请不要贬低我滥用优化,上面的代码是我获得某个结果的最简单方法(幸运的是,最简单的方法似乎也是在我的情况下是最快的!),如果结果不安全,那么我会使用更慢的方式。
提前致谢
【问题讨论】:
标签: c++ gcc unions floating strict-aliasing