gpt4 book ai didi

c++ - MSCV、构造函数、析构函数和 NRVO 行为

转载 作者:行者123 更新时间:2023-11-27 22:53:00 24 4
gpt4 key购买 nike

我想知道 NRVO积极参与我正在从事的项目(即 Qt,使用 MSVC 2013 64 位)。

所以我写了这段代码:

class foo
{
public:
foo(){qDebug() << "foo::foo";}
foo(const foo& c){(void)c;qDebug() << "foo::foo( const foo& )\n";}
~foo(){qDebug() << "foo::~foo";}
};
foo bar()
{
foo local_foo;
return (local_foo);
}
void func()
{
foo f = bar();
}

它给了我以下输出:

foo::foo

foo::~foo

我在上面放置的链接期望的位置:

foo::foo()

foo::foo( const foo& )

foo::~foo()

foo::~foo()

但是当我将 bar 调用替换为

foo f = foo(bar())

然后我得到与链接相同的输出。

所以这是我的问题:为什么“foo f = bar()”不调用复制构造函数?它会调用 operator= 吗?在调用之前,f 是原始存储吗? (那么为什么来自 2004 年的链接的行为方式不同)?所以我必须断定 NRVO 没有打开,对吧?

最佳答案

why does "foo f = bar()" not call copy constructor?

因为编译器允许elide拷贝。

does it call the operator= instead, and before it is call, f is raw storage?

没有。

So why the link, which is from 2004, doesn't behave the same way

大概他们使用了另一个编译器、另一个版本的编译器或编译器的其他设置,并且他们的编译器没有删除拷贝。

So I must conclude NRVO isn't turned on, right?

根据第一个输入,您可以得出 NRVO 开启的结论。从第二个输出中,您可以得出结论,有一个拷贝没有被删除。但是,由于打印的份数比没有 NRVO 时少,因此您可以得出结论,NRVO 已打开,但并未应用于所有拷贝。

what is the difference between "foo f = bar()" and foo f = foo(bar())" then?

第一个拷贝从 bar() 的返回值初始化 f

第二个显式地使用复制构造函数构造一个临时对象,然后从该临时对象复制初始化f。两个拷贝都可以省略。

关于c++ - MSCV、构造函数、析构函数和 NRVO 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35701281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com