基本的に、配列のすべての要素に定数を追加するコードがあります
Matrix a.array() += 32768; //Bad due to hard coded literal
行列のスカラー型はunsigned short int
です。私が検討している他のいくつかのオプションは次のとおりです。
Matrix a.array() += std::numeric_limits<Matrix::Scalar>::max()/2 + 1;
と
Matrix a.array() += (std::numeric_limits<Matrix::Scalar>::max() >> 1) + 1;
2 番目の解決策は私には最も読みやすいように見えますが、1 番目のオプションと比較してペナルティを支払う必要があります。コンパイル時にこれを事前計算する標準コンパイラはありますか?
現在 gcc 4.6.3 を使用していますが、古いコードに依存しているため、C++11 は使用していません。
アップデート:
アセンブリ出力に関する私の限られた知識から、コンパイラはそれを最適化していないと言います。-std=c++0x フラグを付けても話は同じです。
アセンブリ出力は次のとおりです。
ハードコーディングされたリテラル(26 行目を参照)
Update2
-O2 フラグを使用すると、-std=c++0x フラグを使用するかどうかに関係なく、同一のアセンブリ ファイルが生成されます。
結論
-O2 などの最適化フラグが適切に機能するため、おそらく Method2 がベスト プラクティスです。また、これらのコードはクラス メンバー メソッドの一部になっているため、初期化されたプライベート const 変数を使用することになりました。std::numeric_limits<MyMatrix::Scalar>::max()/2 + 1