スマートポインターはその下のポインターであるため、別の 、または任意の種類の別のポインターをshared_ptr
エイリアスしないように関数へのパラメーターを定義する方法はありshared_ptr
ますか?
それとも、これは何らかの理由で不要ですか?
私は gcc >=4.2 および llvm-clang >=2.0 コンパイラに関心があります (他のコンパイラの回答も興味深いでしょう)。
スマートポインターはその下のポインターであるため、別の 、または任意の種類の別のポインターをshared_ptr
エイリアスしないように関数へのパラメーターを定義する方法はありshared_ptr
ますか?
それとも、これは何らかの理由で不要ですか?
私は gcc >=4.2 および llvm-clang >=2.0 コンパイラに関心があります (他のコンパイラの回答も興味深いでしょう)。
でポインターを抽出し、.get()
としてマークするだけ__restrict__
です。関数パラメーターに入れることは、ローカル変数__restrict__
に入れることと同じであることを覚えておいてください。__restrict__
特に、コンパイラは、明らかに同じオブジェクトを指している 2 つのポインターを使用して関数を呼び出すことを止めようとしません。例えばfoo(i,i)
。
特定のポインターが相互に参照しないことをコンパイラーに約束して、コンパイラーがさらに最適化を実行できるようにする場合は、以下のコードを使用して、 and の代わりに and を使用して操作をxp
実行yp
しx
ますy
。
#include<iostream>
#include<memory>
using namespace std;
void foo(shared_ptr<int> x, shared_ptr<int> y) {
int * __restrict__ xp = x.get();
int * __restrict__ yp = y.get();
}
int main() {
shared_ptr<int> i = make_shared<int>(3);
shared_ptr<int> j = make_sharet<int>(4);
foo(i,j);
}
共有ポインターに関連付けられた基になるオブジェクトに対して非エイリアス操作を実行する場合は、非エイリアス ポインター パラメーターを受け取るワーカー ルーチンに明示的に委任できます。
void worker (mytype *__restrict x, mytype *__restrict y)
{
// do something with x, y with a no-alias guarantee
}
int main()
{
std::shared_ptr<mytype> p(new mytype);
std::shared_ptr<mytype> q(new mytype);
// explicitly delegate the shared object
worker(p.get(), q.get());
return 0;
}
あなたが何を考えているのか正確にはわかりませんが、これにより、スマートポインターによって高レベルのメモリ管理を安全に処理できるようになり、低レベルの作業をエイリアスなしのポインターでより効率的に行うことができます。
@BenVoigtが指摘したように、公式にrestrict
は一部にすぎませんc99
-c++
それについて何も知らないはずです。MSVC
とにかくそれをサポートし__restrict
、あなたが言ったようにGCC
持ってい__restrict__
ます。
お役に立てれば。