函数的调用优化
在类中有四大成员函数,构造函数,拷贝构造函数,赋值函数和析构函数,在类外进行实例化时,若调用函数的方法不当则会产生时间和空间的浪费。
以下,将用几个小栗子来说明函数的调用优化的常见办法
类:
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);
//返回时不能返回无名临时变量,由于这个是引用返回,一出函数域就被析构,其值不存在
}
关于一个函数是否可以引用返回要看这个对象是否为局部对象,若受这个函数域影响,则不能进行引用返回
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。