8

私がコーディングしているプログラムでは、関数宣言の1つは次のようになります。

bool parse( const sentence & __restrict sentence )
{
  // whatever
}

Microsoft Visual Studio 2010 Expressを使用してコードをコンパイルすると、コンパイラは次のように文句を言います。

警告C4227:時代錯誤が使用されました:参照の修飾子は無視されます

ただし、GCCのドキュメントのこのページには次のように書かれています。

制限付きポインターを許可することに加えて、制限付き参照を指定できます。これは、参照がローカルコンテキストでエイリアス化されていないことを示します。

そして同じページは非常に明確な例を示しています:

 void fn (int *__restrict__ rptr, int &__restrict__ rref)
 {
   /* ... */
 }

MVSCの警告を誤解しましたか?または、すべての参照をポインターに変換して、それが__restrict適用されるようにする必要がありますか?

4

2 に答える 2

8

C ++にはrestrict、C99のように概念がありません。

ただし、いくつかのコンパイラベンダーは、C ++コンパイラの拡張機能を提供しています__restrict(予約名に注意してください)。それらが拡張機能であることを考えると、それらの動作はコンパイラベンダーによって決定されます。ドキュメントを読んで、この拡張機能が各コンパイラで個別に何をするかを確認する必要があります。

2つのベンダーが同じ名前を選択したからといって、拡張機能に共通点があるわけではありません。

于 2012-10-11T14:20:13.730 に答える
1

おそらくそれはで始まるので__ __restrict、各実装が望むように振る舞うことができる実装固有の拡張です。この場合、両方のコンパイラが正しいと思います。

ポインターへの参照を変更する代わりにrestrict、プロファイラーを使用してホットスポットを見つけるのではなく、C ++のstrict-aliasルールでカバーされていないエイリアシングがかなりのCPU時間を費やしていることを示している場合にのみ、完全に回避しないでください。ポインタへの特定の参照。

于 2012-10-11T14:01:46.590 に答える