std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
Run Code Online (Sandbox Code Playgroud)
许多google和stackoverflow帖子就在这里,但我无法理解为什么make_shared比直接使用更有效shared_ptr.
有人可以一步一步解释我创建的对象序列和两者所做的操作,这样我就能理解make_shared效率如何.我在上面给出了一个例子供参考.
有些情况下,与启动STL一些功能make_前缀一样std::make_pair,std::make_shared,std::make_unique等它为什么一个更好的做法是使用它们,而不是简单地使用构造?
auto pair2 = std::pair< int, double >( 1, 2.0 );
auto pair3 = std::make_pair( 1, 2.0 );
std::shared_ptr< int > pointer1 = std::shared_ptr< int >( new int( 10 ) );
std::shared_ptr< int > pointer2 = std::make_shared< int >( 10 );
Run Code Online (Sandbox Code Playgroud)
我发现了这篇文章,其中一个答案是@kerek SB说的
Run Code Online (Sandbox Code Playgroud)std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo"));在你的代码中,第二个变量只是一个裸指针,而不是一个共享指针.
现在就肉了.make_shared(实际上)更有效,因为它在一个动态分配中将引用控制块与实际对象一起分配.相比之下,采用裸对象指针的shared_ptr的构造函数必须为引用计数分配另一个动态变量.权衡是make_shared(或其表兄allocate_shared)不允许您指定自定义删除器,因为分配是由分配器执行的.
(这不会影响对象本身的构造.从Object的角度来看,两个版本之间没有区别.更有效的是共享指针本身,而不是托管对象.)
现在我对这篇文章有两个问题,如果有人能澄清一下,我会很感激
为什么第二个不是共享指针?这不会增加引用计数
make_shared如何只进行一次内存分配,而new将两次内存分配,从而使make_shared更有效率?
对此有点澄清将不胜感激.
这个链接的问题询问make_shared<>函数和shared_ptr<>构造函数是否不同.
部分答案是,make_shared<>通常会在单个分配中为指向对象和智能指针控制块分配内存.该shared_ptr<>构造函数使用两个分配.
cppreference指出构造函数"必须"这样做,但没有给出任何理由.
为什么是这样?是出于某种原因不可能吗?或者由于其他原因,标准是否禁止它?
我想使用std :: make_shared来创建一个void指针.因为make_shared应该比shared_ptr(new T)快,并且异常保存我想知道是否有一个库函数以make_shared方式创建shared_ptr(new foo).