2016-08-17 99 views
-4

假设我有一个C++类的共享指针创建一个构造下

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

什么是第1行调用?

make_shared<xyz>() 

shared_ptr<xyz>(new xyz()) 

是否依赖于编译器?

+2

的你告诉它叫'新的xyz()',不叫'make_shared' - 这将是非常奇怪的如果你的编译器调用的不是你说的,不是吗? – Anedar

回答

2

该语言对图书馆设施的自动使用很少。

有些情况下核心语言取决于标准库,是的。例如。您必须包含<typeinfo>标题才能使用typeid运算符。有一个未处理的异常std::terminate的呼叫。但除了这些非常特殊和基本的情况外,核心语言和标准库是分开的。有了必要的编译器和操作系统特定功能的知识,您可以自己实现标准库。

因此,简而言之,有没有保证魔术更换您的new -expression与以make_shared一个电话,但如果编译器可以保证可视效果是一样的,那么它可以优化下,这种方式as-if rule。

据我知道有没有编译器还认为这样做,因为2016年八月

+0

如果所有剩下的都是'unique_ptr','make_shared'可以容纳比'shared_ptr(new)'更大的虚拟内存块。问题是如果这是一个可观察到的效果。 –

+0

@MooingDuck:是的,但是我认为在现代系统中可能会出现这种状况,机器会慢慢慢慢地超过蜗牛的速度,所以人们不得不等待数年。可能阻止优化的问题包括(1)自定义分配器。呃,我现在想不到更多。 –

+0

重载'operator new'会是另一个奇怪的边缘情况。 –