2

次のように宣言されたメンバー関数がある場合:

double* restrict data(){
    return m_data; // array member variable
}

restrict キーワードで何かできますか?

どうやら、g++ (x86 アーキテクチャ) ではできませんが、このタイプの構築が理にかなっていて、最適化されたマシンコード生成を可能にする他のコンパイラ/アーキテクチャはありますか?

Blitz ライブラリ (Blitz++) にはこのように宣言された多数の関数があり、実際に何かを行わない限り、誰かが入って restrict キーワードを追加しても意味がないので、私が質問しています。したがって、restrict(コンパイラの警告を取り除くために) を削除する前に、コードをどのように悪用しているかを知りたいと思います。

4

2 に答える 2

3

私たちは何restrictについて話しているのですか?

restrict現在のところ、非標準です。つまり、コンパイラの拡張機能です。C++ 標準がその存在を義務付けていないという意味で移植性がなく、何をすべきかを示す正式なテキストも含まれていません。

restrictは現在、C++ のコンパイラ固有のものであり、それが何をしているのかを正確に確認するには、選択したコンパイラのドキュメントに頼る必要があります。


いくつかの考え

の使用法に関する多くの論文がありrestrict、その中には次のようなものがあります。

restrict同じスコープ内の 2 つのポインターが同じメモリ位置を参照していないことをコンパイラーが認識できるように、ポインターを修飾することが目的であることがいくつかの場所で示唆されています。

これを念頭に置くと、戻り値の型が他のポインターと競合する可能性がないことが簡単にわかります。したがって、そのようなコンテキストで使用しても、通常、最適化の機会は得られません。でも; 確実に知るには、使用されている実装の文書化された動作を参照する必要ありrestrictます。


また、 Blitz++の開発者が関数の戻り型に適用されたの削除について議論している次のスレッドを見つけました。strictこれは何もしないためです。


ちょっとしたメモ

さらなる注意として、LLVMドキュメントnoaliasがvsについて述べていることは次のとおりですrestrict

関数の戻り値については、C99 の restrict は意味がありませんが、LLVM の noalias は意味があります。

于 2014-05-30T19:49:58.990 に答える
0

一般的な制限修飾子は、コードをより適切に最適化するのに役立ちます。「restrict」を削除しても何も壊れませんが、注意せずに追加するとエラーが発生する可能性があります。良い例は、memcpy と memmove の違いです。遅い memmove はいつでも使用できますが、src と dst が重複していないことがわかっている場合にのみ、より高速な memcpy を使用できます。

于 2014-05-30T19:39:45.087 に答える