(Modelo de objetos C ++): optimización del programa

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

Supongo que te gusta

Origin blog.csdn.net/baidu_41388533/article/details/108671921
Recomendado
Clasificación