C ++构造函数/析构函数
c++ constructor / destructor
我有以下代码:
#include <iostream>
using namespace std;
class A
{
public:
A ()
{
cout<<"cons"<<endl;
}
~A ()
{
cout<<"dest"<<endl;
}
};
A
gokul (void)
{
A p;
return p;
}
int
main ()
{
A a = gokul();
cout<<"done\n";
}
当我运行吧。我得到以下输出:
缺点
完成
目的地
我期望输出是:
cons --> p 创建,
cons --> 对于 a,gokul 返回
dest --> p 销毁,gokul 返回
完成
dest --> 销毁,main 返回
因为局部变量 "p" 会在函数 gokul returns 和新变量 "a" 被创建时被销毁,不是吗?我用所有三个标准 03、11 和 14 进行了编译,得到了相同的结果。
~
如果您启用了优化,那么由于编译器优化,您会得到此输出 Copy Elision
enter link description here
或者,如果您 运行 您的程序处于调试模式(没有优化),您不会简单地跟踪使用 @PaulMcKenzie 解释的复制构造函数。
您可以尝试不进行优化编译:/Od
(在 visual studio 中),-O0
在 gcc 中。或者只是 运行 在调试模式下。然后通过 /O2
或 -O2
.
回到优化版本
请注意,从 C++11 开始,如果您切换到非优化版本 /0d
,编译器可以使用移动构造函数,但您仍然没有得到输出。所以你需要跟踪移动构造函数
A(const A&& o){
cout << "move ctor" << endl;
}
您的代码未能跟踪复制构造函数。您需要这样做才能更好地了解对象的创建时间。
#include <iostream>
using namespace std;
class A
{
public:
A() { cout<<"cons"<<endl; }
~A() { cout<<"dest"<<endl; }
A(const &A) { cout << "copy constructed" << endl;}
};
A gokul (void)
{
A p;
return p;
}
int main ()
{
A a = gokul();
cout<<"done\n";
}
当你在Visual Studio2015年运行这段代码,没有优化,输出如下:
cons
copy constructed
dest
done
dest
当您更改为释放模式时,输出现在是这样的:
cons
done
dest
第二个输出没有复制构造的原因是 Named Return Value Optimization
删除了复制。
然而,关键是你真的无法预测复制构造函数被调用了多少次。如您所见,未优化的版本也能正常工作。
我有以下代码:
#include <iostream>
using namespace std;
class A
{
public:
A ()
{
cout<<"cons"<<endl;
}
~A ()
{
cout<<"dest"<<endl;
}
};
A
gokul (void)
{
A p;
return p;
}
int
main ()
{
A a = gokul();
cout<<"done\n";
}
当我运行吧。我得到以下输出:
缺点
完成
目的地
我期望输出是:
cons --> p 创建,
cons --> 对于 a,gokul 返回
dest --> p 销毁,gokul 返回
完成
dest --> 销毁,main 返回
因为局部变量 "p" 会在函数 gokul returns 和新变量 "a" 被创建时被销毁,不是吗?我用所有三个标准 03、11 和 14 进行了编译,得到了相同的结果。 ~
如果您启用了优化,那么由于编译器优化,您会得到此输出 Copy Elision
enter link description here
或者,如果您 运行 您的程序处于调试模式(没有优化),您不会简单地跟踪使用 @PaulMcKenzie 解释的复制构造函数。
您可以尝试不进行优化编译:/Od
(在 visual studio 中),-O0
在 gcc 中。或者只是 运行 在调试模式下。然后通过 /O2
或 -O2
.
请注意,从 C++11 开始,如果您切换到非优化版本 /0d
,编译器可以使用移动构造函数,但您仍然没有得到输出。所以你需要跟踪移动构造函数
A(const A&& o){
cout << "move ctor" << endl;
}
您的代码未能跟踪复制构造函数。您需要这样做才能更好地了解对象的创建时间。
#include <iostream>
using namespace std;
class A
{
public:
A() { cout<<"cons"<<endl; }
~A() { cout<<"dest"<<endl; }
A(const &A) { cout << "copy constructed" << endl;}
};
A gokul (void)
{
A p;
return p;
}
int main ()
{
A a = gokul();
cout<<"done\n";
}
当你在Visual Studio2015年运行这段代码,没有优化,输出如下:
cons
copy constructed
dest
done
dest
当您更改为释放模式时,输出现在是这样的:
cons
done
dest
第二个输出没有复制构造的原因是 Named Return Value Optimization
删除了复制。
然而,关键是你真的无法预测复制构造函数被调用了多少次。如您所见,未优化的版本也能正常工作。