出自:C++ 之旅(第二版)
13.2.1 unique_ptr 和 shared_ptr
使用make_shared()不仅比使用 new 单独创建对象然后将其传递给 shared_ptr 更方便,而且它也明显更有效,因为它不需要单独分配使用计数,这在实现shared_ptr。
我的问题:为什么shared_ptr需要为引用计数分配内存而make_shared()不需要?(它是否只会在至少有两个对数据的引用时才分配它?)
出自:C++ 之旅(第二版)
13.2.1 unique_ptr 和 shared_ptr
使用make_shared()不仅比使用 new 单独创建对象然后将其传递给 shared_ptr 更方便,而且它也明显更有效,因为它不需要单独分配使用计数,这在实现shared_ptr。
我的问题:为什么shared_ptr需要为引用计数分配内存而make_shared()不需要?(它是否只会在至少有两个对数据的引用时才分配它?)
共享指针包含两部分:指向您创建的“对象”的指针,以及指向包含引用计数器和可能需要的其他一些元数据的特殊控制块的指针。
如果创建自己的std::shared_ptr
对象,这两个内存块将分别分配。如果您使用std::make_shared
,那么该函数只会为两个内存块进行一次分配。