假设我有一个C++类的共享指针创建一个构造下
class xyz
{
...
};
class abc
{
shared_ptr<xyz> ptr;
..
abc():ptr(new xyz()) // line 1
{
}
};
什么是第1行调用?
make_shared<xyz>()
或
shared_ptr<xyz>(new xyz())
是否依赖于编译器?
假设我有一个C++类的共享指针创建一个构造下
class xyz
{
...
};
class abc
{
shared_ptr<xyz> ptr;
..
abc():ptr(new xyz()) // line 1
{
}
};
什么是第1行调用?
make_shared<xyz>()
或
shared_ptr<xyz>(new xyz())
是否依赖于编译器?
该语言对图书馆设施的自动使用很少。
有些情况下核心语言取决于标准库,是的。例如。您必须包含<typeinfo>
标题才能使用typeid
运算符。有一个未处理的异常std::terminate
的呼叫。但除了这些非常特殊和基本的情况外,核心语言和标准库是分开的。有了必要的编译器和操作系统特定功能的知识,您可以自己实现标准库。
因此,简而言之,有没有保证魔术更换您的new
-expression与以make_shared
一个电话,但如果编译器可以保证可视效果是一样的,那么它可以优化下,这种方式as-if rule。
据我知道有没有编译器还认为这样做,因为2016年八月
如果所有剩下的都是'unique_ptr','make_shared'可以容纳比'shared_ptr(new)'更大的虚拟内存块。问题是如果这是一个可观察到的效果。 –
@MooingDuck:是的,但是我认为在现代系统中可能会出现这种状况,机器会慢慢慢慢地超过蜗牛的速度,所以人们不得不等待数年。可能阻止优化的问题包括(1)自定义分配器。呃,我现在想不到更多。 –
重载'operator new'会是另一个奇怪的边缘情况。 –
的你告诉它叫'新的xyz()',不叫'make_shared' - 这将是非常奇怪的如果你的编译器调用的不是你说的,不是吗? – Anedar