【C++ Efficiency】找到可能产生“临时对象”的地方

临时对象

  • 不可见:不会再源代码中出现;
  • temp并不是临时对象,只是函数中的一个局部对象。

当产生一个non-heap object,而没有为它命名,便会产生了一个临时对象;

匿名对象通常发生于两种情况:
一是隐式类型转换被实施起来以求函数调用成功;
二是函数返回对象的时候。

为了让函数调用成功而产生的临时对象

发生于“传递某对象给一个函数,而其类型和它即将绑定上去的参数类型不同”的时候。

//返回ch在str中出现的次数
size_t countChar(const string& str,char ch);
 
char buffer[MAX_STRING_LEN];
char c;

//读入一个char和一个string,利用setw避免
//在读入string的时候产生缓冲区溢出的情况。
cin >> c >> setw(MAX_STRING_LEN) >> buffer;
 
cout << "There are" << countChar(buffer,c)
	 << "occurrences of the character" << c_str
	 <<"in" << buffer <<endl;

调用countChar时,第一个自变量是一个char数组,但是函数参数确实const string& :

  • 当“类型不吻合”时,编译器便会产生一个类型string的临时对象;
  • 该对象的初始化方式:以buffer作为参数,调用string的构造函数;
  • countChar的str参数会绑定在string临时对象上,当countChar返回,此临时对象自动销毁。

然而,以上转换,只有当对象以by value(传值)方式传递,或是当对象被传递给一个reference-to-const参数时,这些转换才会发生。如果对象被传递给一个reference-to-non-const参数,并不会发生此类转换,即如果把临时变量作为非const引用参数传递毫无意义。

//str中所有字符改成大写
void uppercasify(string& str);

char subtleBookPlug[] = "Effective C++";
uppercasify(subtleBookPlug); //错误! 

当函数返回对象时产生的临时对象

const Number operator+(const Number& lhs,const Number& rhs);

这个函数返回值是个临时对象,因为它没有名称:它就是函数的返回值;
每次调用operator+需要为这个对象的构造和释放操作付出代价。

总结

临时对象很耗成本,尽可能消除它们。
学会寻找临时对象的产生更重要
在任何地方只要见到常量引用(reference-to-const)参数,就存在建立临时对象而绑定参数的可能。在任何时候只要见到函数返回对象,就会有一个临时对象被建立(然后被释放)。

你可能感兴趣的:(C++进阶,c++,算法,开发语言,笔记)