【问题标题】:shared pointer creation under a constructor在构造函数下创建共享指针
【发布时间】:2016-08-17 21:27:19
【问题描述】:

假设我有一个 c++ 类

class xyz
 {
 ...
 };
class abc 
 {
  shared_ptr<xyz> ptr;
  ..
  abc():ptr( new xyz()) // line 1
   {
   }
 };

第 1 行调用了什么?

make_shared<xyz>()

shared_ptr<xyz>(new xyz())

是否依赖编译器?

【问题讨论】:

  • 你告诉它调用new xyz(),而不是调用make_shared - 如果你的编译器调用的不是你说的,那会很奇怪,不是吗?

标签: c++ visual-studio-2012 constructor shared-ptr


【解决方案1】:

该语言很少自动使用库设施。

在某些情况下,核心语言依赖于标准库,是的。例如。您必须包含 &lt;typeinfo&gt; 标头才能使用 typeid 运算符。对于未处理的异常,还有std::terminate 的调用。但是除了这些非常特殊和基本的情况之外,核心语言和标准库是分开的。了解必要的编译器和操作系统特定功能后,您可以自己实现标准库。

因此,简而言之,不能保证用调用make_shared 来替换您的new-表达式,但如果编译器可以保证可见效果相同,那么它可以 在 as-if 规则下优化这种方式。

据我所知,截至 2016 年 8 月,还没有编译器可以做到这一点。

【讨论】:

  • make_shared 可以容纳比shared_ptr(new) 更大的虚拟内存块,如果剩下的只是unique_ptr。问题是这是否是可观察到的效果。
  • @MooingDuck:是的,但我认为在现代系统上,要达到一种可能的状态,机器会减速到蜗牛的速度,甚至超过第一,所以人们必须等待数年它。可能阻止优化的问题包括 (1) 自定义分配器。嗯,我现在想不出更多了。
  • 重载 operator new 将是另一个奇怪的边缘情况。
猜你喜欢
  • 1970-01-01
  • 2012-09-27
  • 2014-04-10
  • 2021-07-03
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
相关资源
最近更新 更多