Effective Modern C++ 笔记 - 调优

对于C++中的每一种技术或特性都不是万金油,它们在某些情况下使用是合理的,而在另一些情况下则不是。知道什么时候应用这些特性是合理的通常不会太难,但是本章涵盖了两个例外:一个是按值传递参数, 一个是置入。

关于何时使用它们受到许多因素的影响,尽管如此,它们都是现代C++编程的重要部分,下面的条目提供了您需要的信息,以确定使用它们是否适合您的代码。

41:对于可复制的参数,如果move开销小,并且一定会被复制的前提下,考虑将其按值传递

说的就是这个方案:

1
2
3
4
5
class Widget {
public:
void addName(std::string newName)
{ names.push_back(std::move(newName)); }
};

与下面两个方案作对比

1
2
3
4
5
6
7
8
9
class Widget {
public:
void addName(const std::string& newName)
{ names.push_back(newName); }
void addName(std::string&& newName)
{ names.push_back(std::move(newName)); }
private:
std::vector<std::string> names;
};
1
2
3
4
5
6
7
class Widget{
public:
template<typename T>
void addName(T&& newName)
{ names.push_back(std::forward<T>(newName)); }

};

按值传递的仅多一次move,如果move开销小的话,这个方案更简洁且生成的目标更小。

42:考虑置入而非插入

  • 优先用emplace_back(), emplace()这类方法就对了
  • 原则上,放置函数比插入函数更有效,它的效率不应该更低。