コンパイラが関数のいずれかをインライン化できる場合、それが正しいと判断した場合は、ループも展開します。コンパイラがループを展開する利点があると判断するタイミングと方法は非常に複雑な問題であり、使用可能なレジスタの数、ループ内で何が起こるかなど、他の要因に大きく依存します (たとえば、上記の例は疑わしいです)。 、cout ...
おそらく数千倍の時間を消費することを考えると、ループに含まれる5つほどの命令を減らすことで多くの時間を得ることができます-コンパイラがそれを理解できるかどうかは別の問題ですが、完全に不明というわけではありませんコンパイラが関数が小さいかどうかをある程度理解できるようにします。
一方、コードが次のようになっているとします。
int arr[N]; // Global array.
template<int N>
int fun()
{
int sum = 0;
for(int i = 0; i < N; ++i)
{
sum += arr[i];
}
}
次に、コンパイラがループを展開して次のようになることを期待します。
int *tmp = arr;
sum += *tmp++;
sum += *tmp++;
sum += *tmp++;
sum += *tmp++;
sum += *tmp++;
N = 5 と仮定します。
そしてこれは、コンパイラに「可視」であり、コンパイル時に N が既知であるすべての関数に適用されます。したがって、別のソース ファイルにないと仮定すると、 (テンプレート関数であるため、このコンパイル ユニットで表示される必要がある)gun
とまったく同じようにインライン化および展開されると予想されます。fun