ローカル変数での最適化
引用 ChatGPT
if (idx > 0) {
const auto prevCut = dGCut(idx - 1);
const auto currCut = dGCut(idx);
const auto prevTei = viBBwariCut_[idx - 1];
if (currCut == prevCut && prevTei == i) {
continue;
}
}
一見、配列を外に出しただけですが、条件文の配列呼び出しがネックとなる意味ですか?
最適化上、うまくしてくれないのか?
ローカル変数にする意味は何か?
ご質問要旨:
const auto prevCut = dGCut(idx - 1);
const auto currCut = dGCut(idx);
これは単に関数/配列を外に出しただけで、意味があるのか?
回答:意味は大きくあります。キャッシュ・レジスタ活用のためです。
理由1:関数呼び出しやインデックス演算が繰り返されるのを防ぐ
dGCut(...) が単純な std::vector でも operator[] の境界チェックあり(デバッグ時)
operator() なら内部に計算処理がある可能性大
auto でローカル変数に落とすことで1回だけ評価すれば済む
🔸 理由2:コンパイラがレジスタに載せやすい
ローカル変数だと、GCCやClangは積極的にレジスタ割り当てしてくれる
一方、dGCut(idx) を2回書くと、同じ値なのに2回フェッチされる可能性がある
🔧 まとめ
読み出しや計算の重複排除
レジスタ割当最適化を助ける
可読性も上がる
これは明確に意味がある最適化です。