程序的优化
#include <iostream>
using namespace std;
class CTempValue
{
public:
int val1;
int val2;
public:
CTempValue(int v1 = 0, int v2 = 0) :val1(v1), val2(v2) //构造函数
{
cout << "调用了构造函数!" << endl;
cout << "val1 = " << val1 << endl;
cout << "val2 = " << val2 << endl;
}
CTempValue(const CTempValue& t) :val1(t.val1), val2(t.val2) //拷贝构造函数
{
cout << "调用了拷贝构造函数!" << endl;
}
virtual ~CTempValue()
{
cout << "调用了析构函数!" << endl;
}
};
CTempValue Double(CTempValue& ts)
{
CTempValue tmpm;
tmpm.val1 = ts.val1 * 2;
tmpm.val2 = ts.val2 * 2;
return tmpm;
}
int main()
{
CTempValue ts1(10, 20);
Double(ts1);
return 1;
}
int main()
{
CTempValue ts1(10, 20);
CTempValue ts2 = Double(ts1);
return 1;
}
CTempValue Double(CTempValue &ts)
{
CTempValue tmpm; //消耗一个构造函数,一个析构函数
tmpm.val1 = ts.val1 * 2;
tmpm.val2 = ts.val2 * 2;
return tmpm; //生成一个临时对象,然后调用拷贝构造函数把tmpm的内容拷贝构造到这个临时对象中去,然后返回临时对象。
//这个临时对象也消耗了一个拷贝构造函数 ,(如果外部没人接)消耗了一个析构函数;
}
CTempValue Double(CTempValue &ts)
{
return CTempValue(ts.val1 * 2, ts.val2 * 2); //生成一个临时对象。
}
从开发者和编译器视角进行分析
CTempValue Double(CTempValue &ts)
{
return CTempValue(ts.val1 * 2, ts.val2 * 2); //生成一个临时对象。
}
int main(){
CTempValue ts1(10, 20);
CTempValue ts2 = Double(ts1);
Double(ts1);
return 1;
}
void Double(CTempValue &tmpobj, CTempValue &ts) //编译器会插入第一个参数
{
tmpobj.CTempValue::CTempValue(ts.val1 * 2, ts.val2 * 2);
return;
}
int main(){
CTempValue ts1; //分配存储空间,不调用构造函数
ts1.CTempValue::CTempValue(10, 20);
CTempValue tmpobj;
Double(tmpobj, ts1);
return 1;
}
从编译器层面的优化
- linux编译器g++优化,针对 与返回临时对象这种情况。 NRV优化(Named Return Value)。RVO(Return Value Optimization);
- 关闭优化:
g++ -fno-elide-constructors xxx.cpp -o xxx
- 优化说明:
- (1)编译器是否真优化了,不好说,你要做各种测试才知道
- (2)如果你的代码很复杂,编译器可能放弃不优化;
- (3)不要过度优化;
- (4)优化可能使用你犯错误