3

私が正しく取得した場合__declspec(noalias)、パラメーターとして渡されたポインターのいずれもエイリアスされていないことをコンパイラーに伝えます。

__declspec(noalias) void multiply(float * a, float * b, float * c)
{
    ...
}

別の言い方をすると、私が間違っていなければ__restrict、ポインター型のすべてのパラメーターを呼び出すのとまったく同じです。しかし、すべての関数呼び出しを変更せずにそれを行う方法はありますか? 理想的には、それ__declspec(noalias)をプリプロセッサ定義に置き換えます。

4

2 に答える 2

4

あなたの解釈はnoalias間違っていると思います。__restrict各パラメーターで指定するのと同じではありません。MSDN から参照する例では、、、および(現在のコンパイル単位の) グローバル状態を変更または参照しないがa、互いに自由にエイリアスを設定できることを意味します。また、お互いに別名を付けないことを示すために、それぞれを指定することできます。このシナリオですべての関数呼び出しを変更することに言及した理由がわかりません。呼び出し元が引数のエイリアスを作成しない限り、呼び出しサイトでは何も変わりません。すべての呼び出しを確認する必要がありますが、エイリアシングを削除する必要がない限り変更する必要はありません。具体的にはbc__restrict__restrict呼び出しサイトで必要です。

GCC での唯一の類似点は、同じソース ファイル内のグローバル ポインター変数宣言 (互換性のある型) で__restrict(またはより一般的には GCCの場合) を指定することです。file-scopeで修飾されたポインターについては、こちら__restrict__を参照してください。もちろん、関数スコープでのみ考慮されることが多いため、GCC が異なる動作をするという保証はありません。マイクロソフトは、導入した特定の最適化を有効にするために明確に導入しました。restrictrestrictnoalias

簡単に言えば、ここにはマクロトリックはありません(__declspec()GCCで完全に無視するためにRが言及したものを除いて)。あなたができる最善のことは、__restrictエイリアスされていないポインターパラメーターとグローバル変数宣言に追加することです。

于 2013-12-17T00:21:11.687 に答える
-1

ただ#define __declspec(x)(空の定義に)。noalias/restrict を省略しても、正しいプログラムの動作は変更されません。コンパイラが最適化するための追加の (通常は現在のコンパイラ テクノロジではごくわずかな) 機会を作成するだけです。

于 2012-03-10T21:12:23.147 に答える