1

C++ コードベースを Visual Studio 2k3 から Visual Studio 2k8 に移動しています。コードに含まれるもの

#pragma optimize( "a", on )

MSDN によると、これは「エイリアシングを想定しない」という意味です。VS のそれ以降のバージョンはこれをコンパイルすることを拒否し、MSDN はこの #pragma を含むコードをどうするかを述べていないようです。

「エイリアシングを想定しない」とはどういう意味ですか? また、このコード行をどうするかを決定するにはどうすればよいですか?

4

3 に答える 3

5

エイリアシングは、次のようなものがある場合です。

int a[100];

int * p1 = &a[50];
int * p2 = &a[52];

a、p1、および p2 はすべて、配列またはその一部のエイリアスです。この状況は、コンパイラが最適な配列アクセス コードを生成するのを妨げる可能性があります (FORTRAN では禁止されています。これが、配列のパフォーマンスに非常に優れている理由です)。

あなたが求めているプラ​​グマは、コンパイラが上記の状況が存在しないと想定できると言っています。明らかに、これが必要かどうかを判断する必要がある場合は、次の 2 つのいずれかを行うことができます。

  • すべてのコードをチェックする (難しく、エラーが発生しやすい)
  • それをオフにして、パフォーマンスの低下があるかどうかを確認します(簡単で賢明です)

選択はあなた次第です :-)

于 2009-08-19T11:51:55.463 に答える
0

MSDNでは、同じメモリ位置を参照する複数の名前の使用としてエイリアシングを定義しています。

VS.NET でこの最適化を制御するために使用されていた#pragmaディレクティブは、VS.2005 以降ではなくなりました。

変数と関数に注釈を付けるために使用される__restrictキーワード and restrictand修飾子は、同じ仕事をすることができるようです。noalias __declspec

于 2009-08-19T12:12:13.053 に答える