函数的调用优化

函数的调用优化

创新互联专注于成都做网站、网站制作、成都外贸网站建设、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。

    在类中有四大成员函数,构造函数,拷贝构造函数,赋值函数和析构函数,在类外进行实例化时,若调用函数的方法不当则会产生时间和空间的浪费。

    以下,将用几个小栗子来说明函数的调用优化的常见办法

类:

class Test
{
public:
	Test(int d = 0)
		: _data(d)
	{
		cout << "Create Test Object:"<<this << endl;
	}
	Test(const Test&x)
		:_data(x._data)
	{
		cout << "Copy Create Object:" <<this<< endl;
	}
	Test&operator=(const Test&x)
	{
		cout << "Assign:"<<this << endl;
		if (this != &x)
		{
			_data = x._data;
		}
		return *this;
	}
	~Test()
	{
		cout << "Free Test Object:"<<this << endl;
	}
public:
	int GetData() const
	{
		return _data;
	}
private:
	int  _data;
};

方法

Test fun(Test x)
{
	int value = x.GetData();
	Test tmp(value);
	return tmp;
}
void main()
{
	Test t1(100);//构造
	Test t2;//拷贝构造
	t2 = fun(t1);
	/*
	1.fun函数的参数先做一份零时拷贝,调用构造函数;
	2.用value拷贝构造tmp;
	3.返回tmp时再用tmp创建临时变量,调用拷贝构造函数;
	4.出这个函数域后,创建的临时变量进行析构,即x和tmp;
	5.返回的值给t2赋值,调用赋值语句
	6.完成完赋值语句后,析构临时的无名对象(tmp的)
	7.析构t2、t1。
	*/
	getchar();
}

以上是未优化的方法,其占用空间,浪费时间

优化1:

Test fun(Test x)
{
	int value = x.GetData();
	return Test(value);//创建无名临时变量,创建出的变量无名字
	/*
		返回时一般都会拷贝一个临时变量再返回,但这里编译器进行了优化
	直接进行构造了一个无名临时变量(减少了一次拷贝构造函数的调用和析构)
	*/
}
void main()
{
	Test t1(100);
	Test t2;
	t2 = fun(t1);
	/*
	直接用返回的无名临时变量对t2进行赋值
	*/
	getchar();

}

优化2

Test fun(Test&x)
{
	/*
	fun函数中的参数是引用传参,x不用再创建临时对象,省去了拷贝构造函数的调用
	*/
	int value = x.GetData();
	return Test(value);
}

优化3

int main()
{
	Test t1(100);
	Test t2=fun(t1);
	//初始化,只调用构造函数
	getchar();
}

 优化后只调用两次构造函数,两次析构函数

ps:错误优化

Test &fun(Test&x)
{
	int value = x.GetData();
	return Test(value);
	//返回时不能返回无名临时变量,由于这个是引用返回,一出函数域就被析构,其值不存在

}

     关于一个函数是否可以引用返回要看这个对象是否为局部对象,若受这个函数域影响,则不能进行引用返回

新闻名称:函数的调用优化
网站URL:https://www.cdcxhl.com/article20/ihepjo.html

成都网站建设公司_创新互联,为您提供做网站网站排名电子商务服务器托管面包屑导航品牌网站设计

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都做网站