最適化について

こんなページがあった。

(翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕がしたい事をさせてくれないの!
http://d.hatena.ne.jp/yohhoy/20120220/p1


下記のプログラムは32ビット整数の半分を入れ替えており、これは
トルエンディアンとビッグエンディアンのマシン間でデータを
やり取りする際に使われる典型的なコードです。このコードは
strict aliasing rules違反に関する6つの警告を生成しますが、
多くの人は警告を無視してしまうでしょう。このプログラムの
正しい出力は次の通りです:

00000020 00200000

しかし、最適化を有効にした場合は次の通りです:

00000020 00000020

正にこれこそ警告があなたに伝えようとした事であり、オプティマイザは
あなたが望まない事を行っています。オプティマイザがあなたの
コードを破壊したと考えてはいけません。コードはもともと壊れており、
オプティマイザは単にあなたに対して指摘したに過ぎないのです。


swaphalves(uint32_t a)
{
uint32_t acopy=a;
uint16_t *ptr=(uint16_t*)&acopy;// can't use static_cast<>, not legal.
// you should be warned by that.
uint16_t tmp=ptr[0];
ptr[0]=ptr[1];
ptr[1]=tmp;
return acopy;
}

gccの生成したコードの逆アセンブルがある。
端的に言うとptrとacopyがaliasの関係に無い場合、acopyの値は変更されない。なのでaを返すコードを生成してしまう。
ということらしい

詳しく読んでないけど・・・


PS.
brokenを壊れたと訳してる。
合ってるけど、慣用的には「バグってる」かなあ・・・