C++11前vector.push_back传值与const引用的差异及相关疑问
问题解答
问题1:const T&传参与传值的拷贝差异,以及vector push_back的参数设计
const T&接收临时对象调用拷贝构造,和传值调用拷贝构造是否相同?
不一样。如果是传值调用(比如void func(T val)),传入临时对象时,会先调用拷贝构造函数把临时对象复制到形参val;如果函数内部还要把val存入容器(比如vector),还会再触发一次拷贝构造,把val复制到容器内存中,总共两次拷贝。
而用const T&传参时,形参是临时对象的引用,函数内部直接通过这个引用拷贝构造容器元素,只需要一次拷贝,少了一次额外的性能开销。std::vector的
void push_back(const T& Val)可以接收右值,那为何不采用传值方式?
核心原因是效率优先。C++11前没有移动构造,传值不管传入左值还是右值,都会触发两次拷贝构造:第一次是实参拷贝到形参,第二次是形参拷贝到vector的内部存储。而const T&版本只需要一次拷贝(直接从实参(左值或临时右值)拷贝到vector内部),能减少一次不必要的拷贝,对性能更友好。
问题2:const T&为何能够接收右值?
这是C++标准的明确规定:临时对象(右值)可以被绑定到const左值引用上。这么设计是为了让const左值引用成为通用参数类型——既能接收左值,也能接收右值,同时保证不会修改临时对象。而且绑定后,临时对象的生命周期会被延长到这个const引用的生命周期结束(返回引用的特殊场景除外),避免了悬垂引用的问题。
内容的提问来源于stack exchange,提问作者hhu_clj
相关产品推荐
相关产品推荐

