效率:条款19 了解临时对象的来源

来源:互联网 发布:linux i2c 驱动 实例 编辑:程序博客网 时间:2024/06/12 01:38

人们对临时对象有普遍的误解:如swap函数:

<span style="font-size:14px;">template<class T>void swap(T& object1 , T& object2){     T temp = object1;     object1 = object2;     object2 = temp;}</span>

认为temp是一个临时对象,其实不然,temp不是临时对象,而是一个函数的局部对象。

C++真正的临时对象是不可见的-不会出现在源码中,临时对象主要发生在这两种情况:1.当隐式类型转换发生用来调用函数时。2.当函数返回对象的时候。因为临时对象的产生伴随着该对象的构造成本和析构成本,从而影响程序的效率。

1.为了让函数调用成功而产生的临时对象。(此类行为发生在传递某对象给一个函数,而其类型与它即将绑定上去的参数类型不同)列如:

<span style="font-size:14px;">size_t countchar(const string& str,char ch)char buffer[Max_STRING_LEN];char c;cout<<countchar(buffer,c)<<endl;</span>
<span style="font-size:14px;">由于函数的参数是string类型,而实参是个char数组。两者类型不吻合,想要调用成功,编译器会自动产生一个类型为string的临时对象。string temp(buffer);于是countchar函数会将形参绑定到该临时对象上,当countchar返回,此临时对象会被自动销毁。</span>
2.产生临时对象的情况是当函数返回一个对象时。列如:

const Number operator++(const Number& lhs,const Number rhs);
此函数返回值就是个临时对象,因为它没有名称,它就是函数的返回值,每当你调用operator++,该临时对象会进行构造和析构。
想要不承担这份成本,那么在更改该代码是不能克服这个缺陷。所以我们将更改这个函数返回值类型的,是编辑器能够将临时对象优化,使它不存在。就是“返回值优化”策略。

结论:临时对象可能很耗成本,所以你应该尽可能消除他们。然而更重要的是,如何训练出锐利的眼睛,看出可能产生临时对象的地方。任何时候只要你看到一个reference-to-const参数,就极可能会有一个临时对象被产生出来绑定至该参数上。任何时候只要你看到函数返回一个对象,就会产生临时对象(并于稍后销毁)。







0 0