あなたの解釈はnoalias
間違っていると思います。__restrict
各パラメーターで指定するのと同じではありません。MSDN から参照する例では、、、および(現在のコンパイル単位の) グローバル状態を変更または参照しないがa
、互いに自由にエイリアスを設定できることを意味します。また、お互いに別名を付けないことを示すために、それぞれを指定することもできます。このシナリオですべての関数呼び出しを変更することに言及した理由がわかりません。呼び出し元が引数のエイリアスを作成しない限り、呼び出しサイトでは何も変わりません。すべての呼び出しを確認する必要がありますが、エイリアシングを削除する必要がない限り変更する必要はありません。具体的には、b
c
__restrict
__restrict
呼び出しサイトで必要です。
GCC での唯一の類似点は、同じソース ファイル内のグローバル ポインター変数宣言 (互換性のある型) で__restrict
(またはより一般的には GCCの場合) を指定することです。file-scopeで修飾されたポインターについては、こちら__restrict__
を参照してください。もちろん、関数スコープでのみ考慮されることが多いため、GCC が異なる動作をするという保証はありません。マイクロソフトは、導入した特定の最適化を有効にするために明確に導入しました。restrict
restrict
noalias
簡単に言えば、ここにはマクロトリックはありません(__declspec()
GCCで完全に無視するためにRが言及したものを除いて)。あなたができる最善のことは、__restrict
エイリアスされていないポインターパラメーターとグローバル変数宣言に追加することです。