- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道 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/
在我的代码中,我有一个 for 循环,如下所示: for(unsigned int n=10; n > 1; --n) { std::cout 0; n--) { std::cout <<
我想知道 NRVO积极参与我正在从事的项目(即 Qt,使用 MSVC 2013 64 位)。 所以我写了这段代码: class foo { public: foo(){qDebug() <<
我无法让我的项目链接到 Microsoft Visual C++ 2008 Express Edition 中的 Boost(版本 1.37.0)文件系统 lib 文件。文件系统库不是只有头文件的库。
我是一名优秀的程序员,十分优秀!