9

スマートポインターはその下のポインターであるため、別の 、または任意の種類の別のポインターをshared_ptrエイリアスしないように関数へのパラメーターを定義する方法はありshared_ptrますか?

それとも、これは何らかの理由で不要ですか?

私は gcc >=4.2 および llvm-clang >=2.0 コンパイラに関心があります (他のコンパイラの回答も興味深いでしょう)。

4

2 に答える 2

8

でポインターを抽出し、.get()としてマークするだけ__restrict__です。関数パラメーターに入れることは、ローカル変数__restrict__に入れることと同じであることを覚えておいてください。__restrict__特に、コンパイラは、明らかに同じオブジェクトを指している 2 つのポインターを使用して関数を呼び出すことを止めようとしません。例えばfoo(i,i)

特定のポインターが相互に参照しないことをコンパイラーに約束して、コンパイラーがさらに最適化を実行できるようにする場合は、以下のコードを使用して、 and の代わりに and を使用して操作をxp実行ypxます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);
}
于 2012-01-29T00:53:23.483 に答える
5

共有ポインターに関連付けられた基になるオブジェクトに対して非エイリアス操作を実行する場合は、非エイリアス ポインター パラメーターを受け取るワーカー ルーチンに明示的に委任できます。

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__ます。

お役に立てれば。

于 2012-01-29T00:52:33.263 に答える