ホームページ >バックエンド開発 >C++ >C の「restrict」キーワードは何を行い、コードをどのように最適化しますか?

C の「restrict」キーワードは何を行い、コードをどのように最適化しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-26 22:58:17757ブラウズ

What Does the C   `restrict` Keyword Do and How Does It Optimize Code?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。