现代C++如何高效地设计构造函数
不知道啥是
std::move()
的同学请简单做一下课前预习。
传统手艺 const & 与 现代技术 std::move
先从一个我们非常熟悉的情形入手,我们需要写一个Student
类,传入参数为std::string
,任何一名上课认真听讲的学生都会想到传const&
。
class Student {
public:
explicit Student(const std::string &name)
: _name(name) {
}
private:
std::string _name;
};
让我们抛开C++11
后引入的lvalue
rvalue
等繁琐的概念,仅仅从两个例子入手分析一下这种实现方式的开销:
-
情景1:
std::string name("TKONIY"); // 调用一次构造函数 string(const char*) Student stu(name); // _name(name)调用一次构造函数 string(const string&)
一共是两次字符串拷贝。
-
情景2:
Student stu("TKONIY"); // 构造const string& name 参数时调用一次构造函数string(const char*) // _name(name)调用一次构造函数 string(const string&)
本质上和上面一样,两次字符串拷贝。
在情景2中,一行这样的代码竟然需要拷贝两次字符串,这真是非常地糟糕,对性能追求有强迫症的程序员会给Student
类添加一个Student(const char* )
类型的构造函数以减少拷贝次数,但是事实上,C++11
为我们提供了std::move
用于解决此类问题,我们可以修改构造函数为: