ループ展開
プログラムのコードサイズが増大するため、組み込みシステムなどメモリ容量が小さい場合は適切でない。 命令キャッシュミス回数が増え、性能を低下させることがある。
最適化コンパイラは透過的にループ展開するが、展開後のコードは可読性が低下する。
ループ内の処理が関数呼び出しだった場合、インライン展開を伴ったループ展開はコードが膨大になりすぎて現実的でないことがある。従ってそれら2つの最適化の間にはトレードオフの関係があるともいえる。
展開後にどのような最適化が可能かにも依存するが、一時変数用にレジスタを多く必要とする場合は性能が低下する可能性もある。
小さく単純なループは別として、ループ本体内に分岐がある場合は再帰呼び出しより遅くなることがある。
ループのオーバーヘッドは、ポインタまたはインデックスをインクリメントして配列の次の要素を指すための命令群(ポインタ演算)と「ループ終了条件」のテストに由来する。最適化コンパイラなどで配列の個々の要素への参照のためのオフセットを事前に計算でき、それを直接機械語命令列にできるなら、実行時の余分な演算を省くことができる。
ループ展開によってプログラムが長くなったとしても、それ以上に実質的な実行命令数が削減されれば、全体としては性能が強化される。
分岐ペナルティが最小化される。
ループ内の各文が相互に依存していない場合(すなわち、ループのある周回の結果がその後の周回で必要とされない場合)、それらの文は並列計算できる可能性がある。
コンパイル時にループ回数(配列要素数)が不明な場合でも、動的ループ展開を実装可能である(Duff's device)。
最適化コンパイラには自動的または要求に応じてループ展開できるものもある。