union
{
Uint32 Integer;
Float32 Real;
} Field;
IEEEのちょっとしたトリックにそのユニオンを使用する必要がありますが、それは厳密なエイリアシングを破りますか?GCCは警告をスローしていません(衒学的な厳密なエイリアシングでもGCC 4.5および4.6で試しましたが、私が知る限り、GCCは厳密なエイリアシングルールの違反(多くの誤検知/ネガティブ)をうまくキャッチできません。
Field A;
A.Integer = (Value1 & B) || Value2;
return A.Real;
これは私が現在使用しているスニペットであり、警告なしで正しく機能しているように見えますが、特定のコンパイラの最適化では、副作用や未定義の動作が発生する可能性があります。したがって、そのコードが特定の条件下で安全でない可能性がある場合は、それを削除するためにいくつかの努力をします。
また、このコードでは、データを標準レジスタから最新のCPUのフローティングポインティングレジスタに移動する必要があり(これについては興味があります)、古いCPUに比べて余分なサイクルが必要になると思います。
上記のコードは最適化を意図したものではないので、最適化を悪用することを誹謗中傷しないでください。上記のコードは、特定の結果を取得するための最も簡単な方法でした(幸い、最も簡単な方法は、私の場合!)、結果が安全でない場合は、より遅い方法を使用します。
前もって感謝します