制限を使用する場合と使用しない場合

こちらの Mike Acton の記事をお試しください (古いリンク)。制限は、使用しないことによるパフォーマンスへの影響と、誤った使用による結果の両方から恐ろしいものです。

あなたの場合、同じメモリ領域にエイリアスがないため、3つのポインターすべてに制限を安全に適用できるように思えます。ただし、3 番目のポインターで使用しても、パフォーマンス上の利点はほとんどまたはまったくありません。


この特定のケースでは、encodedEnd かどうかに違いはありません。 制限されているかどうか。 エンコードされていないエイリアスを作成しないことをコンパイラに約束しました エンコード であるため、読み取りと書き込みが互いに干渉しません。

この場合、restrict が重要である本当の理由は、制限がないと、コンパイラが encoded を介して書き込みを行うことを認識できないためです。 unencoded による読み取りには影響しません .たとえば、

encoded == unencoded+1

次に、それぞれ encoded に書き込みます エンコードされていないからの後続の各読み取りに影響します であるため、コンパイラは書き込みが完了するまでロードをスケジュールできません。 restrict は、2 つのポインターが同じメモリに影響を与えないことをコンパイラーに約束するため、パイプラインの停止を回避するために十分に先にロードをスケジュールできます。


痛くないというのは正しいと思います。ループ ポインター (p と呼びます) は、ループの最後で encodedEnd と等しくなります。しかし、ループの後に (p または encodedEnd から) 何もアクセスする必要がないため、問題にはなりません。また、encodedEnd から何も書き込まれたり読み取られたりしないため、最適化するものは何もないため、これも役に立たないと思います。

しかし、最初の 2 つの制限が本当に役に立つという意見には同意します。