4

shared_ptrs を多用するコードのプロファイリングを行ったところ、reset() が驚くほど高価であることがわかりました。

例えば:

struct Test {
    int i;
    Test() {
        this->i = 0;
    }
    Test(int i) {
        this->i = i;
    }
} ;
...
auto t = make_shared<Test>(1);
...
t.reset(somePointerToATestObject);

最後の行 (VC++ 2010 で) の reset() をトレースすると、新しい参照カウント オブジェクトが作成されることがわかりました。

既存の参照カウントを再利用し、ヒープを気にしない安価な方法はありますか?

4

1 に答える 1

4

shared_ptr一般的なケースでは、他の やが使用している可能性があるため、既存の参照カウントを再利用することはできませんweak_ptr

somePointerToATestObjectを使用して作成できる場合make_shared()実装では参照カウントとオブジェクトの両方に単一のヒープ割り当てを使用できます。これにより、ヒープ割り当ての 1 つが節約されます。

于 2010-06-15T13:13:28.750 に答える