C++比C语言开销大的原因之一就是,不经意间构造函数中的反复调用,但我们可以人为的控制这一点。1. 编译器的自动优化;2. 程序员编程规范;3. 右值引用
- 编译器的自动优化
临时对象拷贝构造同类型的对象时,系统会优化成构造
(1) 构造临时对象+拷贝构造t —》 构造t
Text t(Text(val)); —》 Text t(val);
Text t=Text(val); —》 Text t(val);
(2) 拷贝构造临时对象+拷贝构造t —》 拷贝构造t
Text t(Text(t0)); —》 Text t(t0);
Text t=Text(t0); —》 Text t(t0); - 程序员编程规范
(1)函数调用传递参数的时候,如果传递的时对象,要按对象的引用进行传递
(2)函数返回对象的时候,应该优先返回一个临时对象
(3)接收返回类型是对象的函数调用时,优先按照初始化的方式接收
其中后两点是配合编译器的优化。 - 右值引用
虽然上述已经解决了一部分问题,但是仍有一些情况没有照顾到,对此C++11提供了右值引用。
(1)提供右值引用void Text::operator=(const Text&& t);
在操作临时对象时,会调用右值引用,补充了很多情况下,无法让临时对象给初始化对象,从而难以使用系统优化,右值引用就解决了这个问题,unique_ptr的实现就用了右值引用。
(2)move函数 text2 (move(text1));
有情况如:text2(text1);且text1以后不再使用,那么如何直接把text1的资源给text2呢?就用move(text1),这可以看成把text1强转成临时对象,然会就会调用右值引用。