我一直在研究有关NRVO的这篇文章。
(NRVO是C++中一种优化技术,称为返回值优化)
class RVO
{
public:
RVO(){
printf("I am in constructor\n"); }
RVO(const RVO& c_RVO) {
printf("I am in copy constructor\n"); }
~RVO(){
printf("I am in destructor\n"); }
int mem_var;
};
RVO MyMethod(int i)
{
RVO rvo;
rvo.mem_var = i;
return (rvo);
}
int main()
{
RVO rvo;
rvo=MyMethod(5);
}
以下是 Visual Studio 上的输出,这是我对其理解的方式。
I am in constructor // main rvo construction
I am in constructor //MyMethod rvo construction
I am in copy constructor //temporary created inside MyMethod
I am in destructor //Destroying rvo in MyMethod
I am in destructor //Destroying temporary in MyMethod
I am in destructor //Destroying rvo of main
如果我将主要部分写成以下方式:
int main()
{
RVO rvo = MyMethod(5);
return 0;
}
输出如下,如何理解它?
I am in constructor //MyMethod rvo construction
I am in copy constructor //temporary created inside MyMethod
I am in destructor //Destroying rvo in MyMethod
I am in destructor //Destroying rvo of main
为什么第二个版本中的Mymethod
中的临时变量没有被销毁?
为什么在RVO rvo = MyMethod(5);
中不调用复制构造函数?我认为在第二个版本中应该调用两次复制构造函数,一次是在Mymethod
内部创建的临时变量,另一次是在RVO rvo = MyMethod(5);
中。 我知道某些调用可能被省略了。 能否有人帮忙解释这些调用。
编辑:
使用return rvo
而不是return (rvo)
会改变输出结果
第一种情况
I am in constructor
I am in constructor
I am in destructor
I am in destructor
第二个案例
I am in constructor
I am in destructor
我猜当我去掉括号时,NRVO就开始起作用了。但我更感兴趣的是第一个输出,当没有优化时。