make_shared 为对象和引用计数器分配单个块。因此,使用这种技术有明显的性能优势。
我在 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(有一个 ref 计数器),然后在0x01208dec有一个 Test 对象。地点彼此非常接近。
在第二个版本中,我们有0x01208d90用于参考计数器,0x01203c50用于对象。这些位置相当遥远。
这是正确的输出吗?我理解正确吗?