注:明確にするために、質問はrestrict
一般的なキーワードの使用に関するものではなく、具体的にはここで説明されているメンバー関数への適用に関するものです。
gcc を使用すると、__restrict__
(C99 の に相当する GNU++ のrestrict
) 修飾子をメンバー関数でthis
使用でき、関数のスコープ内で限定修飾ポインターを効果的に作成できます。牛肉はどこ?
ほとんどのメンバー関数は他のメンバーで動作しthis
、 を介してアクセスしますT* const
(通常はエイリアスされていません)。エイリアスされる可能性があるためthis
、メンバー関数内で何らかの形で使用されている型への 2 番目のポインターが必要であり、それはどこかから取得する必要があります。
これは、たとえば、すべての二項演算子や、少なくとも 2 つのポインターまたは同一の非自明な型の参照を取るその他の自由関数など、非メンバー関数の場合によくある状況です。ただし、これらの関数には がないthis
ため、関係ありません。
代入演算子、コピー コンストラクター、および単項比較演算子は 、原則としてエイリアス化this
できるメンバー関数の例です (別のオブジェクトが参照を介して渡されるため)。したがって、これらに restrict 修飾子を割り当てることは本当に意味があります。コンパイラーにとっては、他のすべての関数が restrict プロパティを持っていることはすでに明らかなはずです (T への 2 番目のポインターが存在しないため)。
たとえば、restrict
onを使用したoperator=
場合、結果として自己割り当てをまったくチェックしないでください。これthis
は、その関数のスコープ内でエイリアス化されていないと言っているためです ( true の場合、自己割り当ては発生しない可能性があります)。
明らかに、これは事前に知ることができないものであり、意味をなさないものでもあります.
では、実際にメンバー関数に制限修飾子を与えたい場合と、それが理にかなっているのはどのような場合でしょうか?