restrict
C99 に追加されたキーワードの主な用途の 1 つは、コンパイラが何かをレジスタにロードし、レジスタがロードされた変数の状態を反映すると想定できるようにすることです。与えられた
void foo1(int * restrict a, int * restrict b) {
(*a)++; (*b)++; (*b)+=(*a);
}
(*b)
コンパイラーは、 への書き込みが に影響を及ぼさないと想定する権利があるため、書き込み後(*a)
に再ロードする必要がなくなり(*a)
ます。restrict
エイリアシングに他の影響はありますか? たとえば、次のようになります。
extern void foo2a(int * restrict q);
extern void foo2b(void);
int x;
int foo2(restrict int *q) {
int z=x;
x++; *q++; x++;
foo2a(&z);
x++; *q++; z++;
foo2b();
x++; *q++; z++;
return x+(*q)+z;
}
コンパイラは、 のインクリメント、および*q
への呼び出しがすべて を妨害した可能性があること、および呼び出しがおよびの値に「関心がある」可能性があることを予測する必要がありますか? コンパイラは、 への呼び出しがそのパラメータを永続化した可能性があると想定する必要がありますか?foo2a()
foo2b()
x
x
*q
foo2a()
restrict
foo2b()
z
キーワードにもかかわらず、コンパイラーが最悪の場合の仮定の下で動作する必要がある場合restrict
、コンパイラーが関数呼び出しの前に特定の変数への変更を保存し、次回それをリロードする通常の義務を無視する許可を与える方法はありますか?それは必要ですか?