C の 'Restrict' キーワードは何を意味しますか?
C の制限キーワード (C 14 より前の構文は、 GCC 拡張) は、関数に渡される 2 つ以上のポインターが重複するメモリをポイントしないことを指定します。
C99 標準
C99 では、restrict は、コンパイラーがポインターが互いにエイリアスしないと想定できるようにすることでコードを最適化することを目的としています。これにより、次の例に示すように、ループのアンローリングやベクトル化などの最適化が有効になり、パフォーマンスが大幅に向上する可能性があります。
void f(int *a, int *b, int *x) { *a += *x; *b += *x; } void fr(int *__restrict__ a, int *__restrict__ b, int *__restrict__ x) { *a += *x; *b += *x; }
制限がなければ、'x' の値をロードするには 2 つのアセンブリ命令が必要です。 'a' と 'b' の両方ですが、restrict を使用すると、'x' の値は 1 回だけロードされます。
GCC最適化
GCC は、次のアセンブリ コードに示すように、restrict を活用してコードを最適化できます。
f: mov (%rdx),%eax add %eax,(%rdi) mov (%rdx),%eax add %eax,(%rsi) fr: mov (%rdx),%eax add %eax,(%rdi) add %eax,(%rsi)
この例では、restrict で最適化された 'fr' 関数の値が 1 つ減ります。最適化されていない 'f' よりもアセンブリ命令function.
Arrays
Restrict は、配列を参照するポインター引数を処理する場合に特に便利で、コンパイラーが memset や memcpy などの操作を最適化できるため、パフォーマンスが向上する可能性があります。
配列例
void f(char *restrict p1, char *restrict p2, size_t size) { for (size_t i = 0; i < size; i++) { p1[i] = 4; p2[i] = 9; } }
restrict を使用すると、効率を高めるために memset を使用するようにこのコードを最適化できます。制限を削除すると、この最適化が無効になり、配列が重複している場合に誤った動作が発生します。
厳密なエイリアシング ルール
制限は、厳密な規則のため、互換性のある型のポインターにのみ適用されます。エイリアシングルール。互換性のない型を有効な型にキャストすると、制限コントラクトが壊れ、未定義の動作が発生する可能性があります。
GCC Extensions
GCC では、参照と制限を併用することもできます。メンバー関数を追加し、最適化機能の範囲を拡張します。
以上がC の「restrict」キーワードは何を行い、コードをどのように最適化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。