大まかな理解はしていますが、restrictいくつかの細かい点を明確にしたいと思っています。あるバッファから null で終わる文字列を読み取り、別のバッファに URL エンコードされたバージョンを書き出す関数があります。関数には次のシグネチャがあります (現在は なしrestrict):
char const *StringUrlEncode(char const *unencoded,
char *encoded,
char *encodedEnd);
unencoded私のヌル終了ソース文字列です。encoded宛先バッファはandで表されますencodedEnd。ここで、 はバッファ内encodedの最初のものを指し、バッファの後の最初の charを指します。つまり、関数はsを書き込みますが、 が指す場所は含みません。これは基本的な/イテレータです。 C++ STL 規則に精通している場合は、ペアにしてください。charencodedEndcharencodedEndbeginend
この関数に追加restrictする場合、最初の 2 つのパラメーターにのみ適用する必要があります。
char const *StringUrlEncode(char const *restrict unencoded,
char *restrict encoded,
char *encodedEnd);
または、3つのパラメーターすべてに追加することで理解できない利点がありますか?
入力バッファーと出力バッファーを作成するとrestrict、それらがオーバーラップしていないことをコンパイラーが認識するのに役立つことがわかります。しかし、最後のパラメーター ,encodedEndは出力バッファーの末尾をマークするためにのみ使用されるため、restrictここでコンパイラーにとって実際には何の助けにもならないと思います (ただし、不要なノイズを追加する以外は、害はないと思いますが)関数宣言に)。