从std::vector
的cpp文档中,我看到了这样的内容:
void push_back ( const T& x );
我知道push_back
会复制我传递的对象,但是为什么签名是const T&?
看起来它应该接受一个vector
中要推送的任何对象的const
引用。
void push_back(T x);
也就是说,按值传递参数 x
。然而,在 C++03 中,这将导致创建一个额外的 x
的副本(即传递给 push_back
的参数中的副本)。通过以常量引用方式传递 x
可以避免这种情况。
让我们看一下按值传递参数 v.push_back(T())
的堆栈:
v.push_back(T()); // instance of T
void std::vector<T>::push_back(T x) // copy of T
new (data_[size_ - 1]) T(x) // copy of copy of T
v.push_back(T()); // instance of T
void std::vector<T>::push_back(const T &x) // const reference to T
new (data_[size_ - 1]) T(x) // copy of T
在C++11中,尽管没有必要,也可以通过按值获取x
并使用std::move
将其移动到向量上:
v.push_back(T()); // instance of T
void std::vector<T>::push_back(T x) // copy of T
new (data_[size_ - 1]) T(std::move(x)) // move the copy of T
T const&
(以及T&&
重载),因为并非所有对象都可以高效地移动。 - R. Martinho Fernandes为了避免额外的拷贝,你所推送的object
是通过引用传递的。然后在vector
中放置一个副本。
push_back
通过值接收它的参数,那么会发生的是你会从你的对象开始。该对象的副本将作为参数传递给push_back
。然后push_back
将创建一个该副本的副本放入向量中。push_back
的实际实现接收其参数的引用,因此它(push_back
)直接在向量中创建原始对象的副本作为新对象。