__restrictそれが唯一のポインターパラメーターである場合、関数ポインターパラメーターにMSVC/GCC 非標準修飾子を指定する利点はあり ますか? 例えば、
int longCalculation(int a, int* __restrict b)
bを指していないことを意味するため、より適切な最適化が可能になるはずですが、すべての例で、それらの間にエイリアシングがないことを示す2つのポインターをa見てきました。__restrict
__restrictそれが唯一のポインターパラメーターである場合、関数ポインターパラメーターにMSVC/GCC 非標準修飾子を指定する利点はあり ますか? 例えば、
int longCalculation(int a, int* __restrict b)
bを指していないことを意味するため、より適切な最適化が可能になるはずですが、すべての例で、それらの間にエイリアシングがないことを示す2つのポインターをa見てきました。__restrict
コメントで述べたように、とにかくbポイントできないため、エイリアシングの可能性はありません。aしたがって、関数がそのパラメーターでのみ機能するという意味で純粋である場合、実際の利点はありません。
ただし、関数が内部でグローバル変数を使用している場合は、これらのグローバル変数のいずれも指していない__restrictことが明らかになるため、再び利点が得られる可能性があります。b
興味深いケースとして、関数内でメモリの割り当てと割り当て解除を行う場合があります。コンパイラは、理論的にbはそのメモリを指していないことを確認できますが、私にはわからないことを認識しているかどうかは、割り当ての呼び出し方法に依存する可能性があります。
ただし、個人的に__restrictは、署名を避けて、このようなことをすることを好みます
int longCalculation(int a, int* b){
assert(...);//ensure that b doesn't point to anything used
int* __restrict bx = b;
...
}
IMOには、次の利点があります。
__restrict関数シグネチャは、使用される非標準を公開しません__restrictusing に準拠していることを確認assertする機能。エイリアシング ポインターを関数に渡すと、エイリアシングされていないことを期待してバグを追跡するのが困難になる可能性があるためです。