restrict
は、コンパイラがポインタに対して「以前は fortran のみ」の最適化を実行できるようにすることで、最近多くの注目を集めている C99 の機能です。また、Microsoft が最近 C++AMP 仕様の基盤として発表したのと同じキーワードでもあります。
そのキーワードは実際に FCD に含まれていますか? そうでない場合、それが省略された特定の理由はありますか?
C++11 FDIS での唯一の言及はrestrict
、§17.2 [library.c] にあります。
多くのライブラリ関数の記述は、それらの関数のシグネチャとセマンティクスについて C 標準ライブラリに依存しています。そのようなすべての場合において、
restrict
修飾子の使用は省略されます。
restrict
C++11 ではそうではありません。
多くの操作はプリミティブ型へのポインターを使用して行われるため、CコードにはC ++よりもエイリアシングの問題restrict
が多いため、CにはC++以上のものが必要であるという議論があります。
エイリアシングルールでは、異なるタイプへのポインターはエイリアシングできないため、関数へのパラメーターが異なるクラスタイプである場合、それらはオーバーラップできません。
C ++にはvalarray
、エイリアスが許可されていないプリミティブ型の配列を処理することになっているクラスのファミリーもあります。あまり使われているわけではありません...
エイリアシングの問題を解決するためのさらに別の方法を追加しても、明らかに委員会を十分に興奮させることはできませんでした。
http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/
VC++ チームだけでなく、ISO C++ 標準化委員会も、それぞれ VC++ と ISO C++ に制限を追加することを検討しました。ISO C++11 向けに具体的に提案されていましたが、C++ はより多くのオプションを備えたより大きな言語であり、機能が正しく動作することを確認したいため、C++ コードにどのように拡張されるかが常に明らかであるとは限らないため、却下されました。言語全体。
それがC++1xにあるとは思わないでください(残念ながら、0xの時間が長くなりました...!)が、少なくともmsvcとg++はそれ__restrict
と__restrict__
拡張機能をサポートしています。(私はgccをあまり使用しません、それが正しい拡張子だと思います)。
C ++で適切に動作するには、ポインタだけでなく、おそらく私の質問のC++エイリアシングルールに沿った制限付き参照も必要になると思います。これらの考慮事項のいくつかが物事を妨げている可能性があるかどうかはわかりません...
「どうして?」にクラックします。
restrict
基本的に、コンパイラが検証できないという単なるアサーションです。(より正確には、コンパイラがそれを検証できる場合、アサーション自体は役に立ちません。) これは、C++ 委員会が好むようなものではありません。C++ は常に「十分にスマートなコンパイラ」を想定する傾向がありました。ほら、コンパイラが追いつく前の最も単純な C++ ライブラリの恐ろしいパフォーマンスを見てください。
また、委員会はrestrict
、他のすべての C++ 機能 (参照、右辺値参照、何とか何とか) が存在する中でセマンティクスを正確に定義することは自明ではないと感じていたのではないかと思います。
したがって、指定するのは自明ではありません+「十分にスマートなコンパイラはそれを必要としません」= NAK。