Optimización del programa
#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; }
- Objetos temporales devueltos por nadie del exterior
- Resultado de salida:
- Objetos temporales devueltos por alguien de fuera
- Los objetos temporales están integrados en ts2
int main() { CTempValue ts1(10, 20); CTempValue ts2 = Double(ts1); return 1; }
- Resultado de salida:
- Código de análisis
CTempValue Double(CTempValue &ts) { CTempValue tmpm; //消耗一个构造函数,一个析构函数 tmpm.val1 = ts.val1 * 2; tmpm.val2 = ts.val2 * 2; return tmpm; //生成一个临时对象,然后调用拷贝构造函数把tmpm的内容拷贝构造到这个临时对象中去,然后返回临时对象。 //这个临时对象也消耗了一个拷贝构造函数 ,(如果外部没人接)消耗了一个析构函数; }
- mejoramiento
CTempValue Double(CTempValue &ts) { return CTempValue(ts.val1 * 2, ts.val2 * 2); //生成一个临时对象。 }
- Resultado de salida:
- Una estructura y un destructor faltantes
Análisis desde la perspectiva de desarrolladores y compiladores
- Perspectiva del desarrollador:
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; }
- Perspectiva del compilador:
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; }
Optimización desde el nivel del compilador
- El compilador de Linux g ++ está optimizado para la situación de devolución de objetos temporales. Optimización de VRN (valor de retorno con nombre). RVO (optimización del valor de retorno);
- Desactive la optimización:
g++ -fno-elide-constructors xxx.cpp -o xxx
- Configuración optimizada de Visual Studio
- Instrucciones de optimización:
- (1) Si el compilador está realmente optimizado, es difícil de decir, tienes que hacer varias pruebas para saber
- (2) Si su código es muy complicado, el compilador puede renunciar a no optimizar;
- (3) No optimice demasiado;
- (4) La optimización puede usarlo para cometer errores