-3
私が保守しているコードは、多くの場所で以下のタイプの行を持っています。gcc定数を使ったビット演算を伴うコードの最適化
x = x | ((0x1 & 0x3ff) << 16);
x |= (0x7 << 28);
y = y | (0x3 << 8);
コードを-O3フラグでコンパイルします。 最適化中のコンパイラ(gcc)は定数を含むビット操作を簡略化して最適化しますか?
1行目では、それはそれは
y = y | 0x300;
の代わりに、実際のビットシフトを行うための命令の追加を行う必要があります
x = x | 0x3ff0000;
または3行目に行う必要があります。
はい、これらの定数式は、プリコンパイラの段階で展開されます。しかし '((0x1&0x3ff)<< 16)'は '0x3ff0000'ではなく' 0x10000'です。 –
... '-O3'や' -O'fwiwがなくてもそうなります。 – spectras
アセンブリコードを見てみませんか? – Olaf