当-fno-elide-constructors选项与clang或gcc一起使用,并且按值返回对象时,我对C++的正确语义感兴趣。如果我有此功能并调用它:
X foo()
{
X x(0);
X y(1);
X z;
if (rand() > 50)
z = x;
else
z = y;
return z;
}
X z = foo();
那么我可以看到X的副本构造函数仅被调用一次。但是,如果我稍微修改一下函数,如下所示:
X foo()
{
X x(0);
X y(1);
if (rand() > 50)
return x;
else
return y;
}
X z = foo();
然后复制构造函数被调用两次。从实现的 Angular 来看,在后一种情况下我可能会觉得有必要这样做,但令我感到困惑的是,似乎即使我们明确关闭了复制省略功能,根据函数的实现方式,也会调用不同数量的复制构造函数。
标准中是否有涵盖此行为的部分?
最佳答案
在第一种情况下,您会看到return value optimization,这基本上意味着编译器会在函数的返回槽中分配z
。在第二种情况下,此方法将不起作用,因此您在此处看到了另一个副本。复制省略是不同的:http://en.wikipedia.org/wiki/Copy_elision,在这里不适用。该标准只是说类似编译器可以自由省略不必要的副本,这允许但不要求任何一种优化。
关于c++ - 具有-fno-elide-constructors的临时对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23854249/