make_shared は、オブジェクトと参照カウンターに 1 つのブロックを割り当てます。したがって、このような手法を使用すると明らかにパフォーマンスが向上します。
私はVS2012で簡単な実験を行い、「証拠」を探していました:
std::shared_ptr<Test> sp2 = std::make_shared<Test>();
std::shared_ptr<Test> sp(new Test());
// Test is a simple class with int 'm_value' member
デバッグ時にローカルビューでこのようなものを取得しました(一部の行は削除されています)
- sp2 shared_ptr {m_value=0 } [make_shared] std::shared_ptr<Test>
+ _Ptr 0x01208dec {m_value=0 } Test *
+ _Rep 0x01208de0 make_shared std::_Ref_count_base *
- sp shared_ptr {m_value=0 } [default] std::shared_ptr<Test>
+ _Ptr 0x01203c50 {m_value=0 } Test *
+ _Rep 0x01208d90 default std::_Ref_count_base *
sp2は 0x01208de0 に割り当てられ(参照カウンターがあります)、0x01208decにTest オブジェクトがあるようです。場所は互いに非常に近いです。
2 番目のバージョンでは、参照カウンターに0x01208d90 、オブジェクトに0x01203c50があります。それらの場所はかなり離れています。
これは適切な出力ですか?これを正しく理解していますか?