【问题标题】:What stops compilers from automatically deducing to use make_shared?是什么阻止编译器自动推断使用 make_shared?
【发布时间】:2014-07-28 08:58:12
【问题描述】:

我明白了:

shared_ptr<X> x = make_shared<X>();

比以下更有效:

shared_ptr<X> x(new X());

我了解这些优势。但是,我不明白为什么编译器不能有这样的规则

"如果我看到 new()shared_ptr 声明在同一行,请使用 make_shared"

那么是什么阻止了编译器自动使用make_shared 并要求我们指定它?

【问题讨论】:

  • 这不是关于效率,而是关于异常安全。
  • make_shared 的效率提升来自于在一个地方分配对象和引用计数,因此调用make_shared 可以导致不同的大小分配。有人可能有一个自定义的operator new,如果没有调用它(使用正确的size 操作数),代码的可观察行为将会改变。
  • 所以你希望标准只为一种类型在核心语言中创建一个特殊情况(这可能需要相当多的工作才能正确指定),所有这些都是为了让你免于输入几个字符?
  • @Mankarse 另外,我可以为我自己的一种类型编写std::make_shared 的特化,它做了完全不同的事情。 (这不是好的编码习惯,但它是合法的 C++。)
  • make_shared 可能有一个缺点 - 只要有指向它的弱指针,即使不再有任何共享指针,对象的内存也不会被释放。因此,当程序员没有指定它时,自动使用它可能会对内存使用产生负面影响,即使“好像”规则确实适用。

标签: c++ memory-management shared-ptr smart-pointers make-shared


【解决方案1】:

可能可以做到,但是添加另一个特殊规则只是为了节省打字是无效的,也不是 c++ 的哲学,如果有人想出一个更好的 shared_ptr 怎么办,如果 std::shared_ptr 是一个模板那么只是制作一个 better_shared 模板,你就完成了。如果它进入核心语言,尽管它永远存在。

还要注意,它不会节省很多打字:

auto x = make_shared&lt;X&gt;()shared_ptr&lt;X&gt; x(new X())

这也比“如果我看到new() 和共享指针然后使用make_shared”更复杂,因为make_shared 只替换了shared_ptr 构造函数的13 个(我认为)重载之一。这些规则无疑是标准中已经足够大的页面。只需使用make_shared,就不需要额外的规则了。

【讨论】:

  • 再说一次,我并不反对这个概念——我只是想了解为什么编译器无法自动检测到这一点。谢谢。
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
相关资源
最近更新 更多