C ++析构函数调用返回值的时间
C++ destructor called timing for returned value
考虑如下 C++ 代码:
struct V {
int s;
V(int s): s(s) {}
~V() { cout << "Destructor\n"; }
};
V f() {
V x(2);
return x;
}
int main(){
V a = f();
cout << "Function End\n";
return 0;
}
执行结果显示析构函数只调用了一次
Function End
Destructor
但是,如果我添加如下无意义的 if 语句,析构函数将被调用两次。
V f() {
if(false) return V(3);
V x(2);
return x;
}
Destructor
Function End
Destructor
为什么会这样?有没有避免两次调用析构函数的要点?
在第一个示例中,NRVO(命名为 Return 值优化)可能会启动并删除 return x;
中的副本。
当你有两个退出路径,不返回同一个变量时,NRVO 不太可能启动,你实际上会得到一个副本,即使 if(false)
永远不会 true
.
下面的内容很可能也会省略副本,因为 x
在通往 return
.
的所有路径中返回
V f() {
V x(2);
if (false) x = V(3);
return x;
}
考虑如下 C++ 代码:
struct V {
int s;
V(int s): s(s) {}
~V() { cout << "Destructor\n"; }
};
V f() {
V x(2);
return x;
}
int main(){
V a = f();
cout << "Function End\n";
return 0;
}
执行结果显示析构函数只调用了一次
Function End
Destructor
但是,如果我添加如下无意义的 if 语句,析构函数将被调用两次。
V f() {
if(false) return V(3);
V x(2);
return x;
}
Destructor
Function End
Destructor
为什么会这样?有没有避免两次调用析构函数的要点?
在第一个示例中,NRVO(命名为 Return 值优化)可能会启动并删除 return x;
中的副本。
当你有两个退出路径,不返回同一个变量时,NRVO 不太可能启动,你实际上会得到一个副本,即使 if(false)
永远不会 true
.
下面的内容很可能也会省略副本,因为 x
在通往 return
.
V f() {
V x(2);
if (false) x = V(3);
return x;
}