可能的重复:
为什么析构函数只被调用一次? https://stackoverflow.com/questions/6422114/why-has-the-destructor-been-called-only-once
鉴于下面的代码,我无法理解 gcc 中的输出。我期望创建和销毁两个对象,但只看到对构造函数和析构函数的一次调用。这里发生了什么事?
#include <string>
#include <iostream>
struct Huge{
Huge() { std::cout << "Constructor" << std::endl; }
Huge(Huge const &r) { std::cout << "Copy Constructor" << std::endl; }
~Huge() { std::cout << "Destructor" << std::endl; }
};
Huge g() {
std::cout << "Entering g" << std::endl;
Huge temp;
std::cout << "Exiting g" << std::endl;
return temp;
}
int main(){
Huge h2(g());
std::cout << "Before leaving main" << std::endl;
}
该代码在 g++ (4.4) 中的输出是
输入g
构造函数
退出 g
离开主线之前
析构函数
是的,这是复制省略命名返回值优化 http://en.wikipedia.org/wiki/Return_value_optimization.
C++ 标准允许实现省略由 return 语句产生的复制操作,即使复制构造函数有副作用。
参考:
C++03 标准:
12.8 复制类对象:
# 15
当满足某些条件时,允许实现省略类对象的复制构造,即使该对象的复制构造函数和/或析构函数有副作用。在这种情况下,实现将省略的复制操作的源和目标视为引用同一对象的两种不同方式,并且该对象的销毁发生在两个对象没有被销毁的较晚时间。优化.111) 复制操作的这种省略是允许的
以下情况(可以组合消除多份):
— 在具有类返回类型的函数中的 return 语句中,当表达式是与函数返回类型具有相同 cv-unqualified 类型的非易失性自动对象的名称时,可以通过构造自动对象来省略复制操作对象直接进入函数的返回值
— 当未绑定到引用 (12.2) 的临时类对象被复制到具有相同 cv-unqualified 类型的类对象时,可以通过将临时对象直接构造到被省略的目标中来省略复制操作复制
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)