Vector 的拷贝构造函数

来源:互联网 发布:中信银行淘宝卡 编辑:程序博客网 时间:2024/05/30 02:26

大家都知道拷贝构造函数调用的常见情形包括

1.函数参数传递,函数实参到形参的过程中调用拷贝构造

2.函数返回,函数返回一个对象时会调用拷贝构造函数

3.对象定义时赋值 如 A a=b 这里b也是类A的一个对象


vector中保存了很多对象的拷贝,当vector调用拷贝构造函数时,容器里面的对象都会被拷贝一份到新的容器里,如果容器中对象数目比较多,则这样的开销是十分昂贵的。但是看到一些工程代码中,函数里面局部vector对象里面保存了大量的对象,在函数结束时直接将vector对象返回。我就在想,这样一来岂不是会有很大的性能开销。经过我自己写的一个demo验证,得出结论:vector其实是存在两个拷贝构造函数的,在VS2012中两个函数的定义如下:

拷贝构造函数一:

vector(const _Myt& _Right)
 #if _HAS_CPP0X
: _Mybase(_Right._Getal().select_on_container_copy_construction())
 #else /* _HAS_CPP0X */
: _Mybase(_Right._Getal())
 #endif /* _HAS_CPP0X */
{ // construct by copying _Right
if (_Buy(_Right.size()))
_TRY_BEGIN
this->_Mylast = _Ucopy(_Right.begin(), _Right.end(),
this->_Myfirst);
_CATCH_ALL
_Tidy();
_RERAISE;
_CATCH_END
}


拷贝构造函数二:

vector(_Myt&& _Right)
: _Mybase(_Right._Getal())
{ // construct by moving _Right
_Assign_rv(_STD forward<_Myt>(_Right));
}


形如:Vector v1=v2会调用拷贝构造函数一,在该函数中会将v2中的所有元素全部拷贝一份到v1里面,调用拷贝构造函数的开销是相当昂贵的。

但是当 形如 vector v1=fun();  fun(){ vector v; return v}这样的函数调用,在函数返回时会调用拷贝构造函数二,在拷贝构造函数二中只是会修改 v1的三个迭代器(_Myfirst、 _Mylast、 _Myend)使得V1的三个迭代器指向v中对应迭代器所指向的位置,并且把v的三个迭代器赋值为空,使得在v析构时不会修改v容器中的元素,这样就相当于v1中保存了v中的所有元素,并且没有容器中元素拷贝的性能损失。


以下是我的Demo:

#include<iostream>
#include<vector>
using namespace std;


class Test
{
public:
int data;
Test()
{
cout<<"Test Constrcut"<<endl;
}
~Test()
{
cout<<"Test Destruct"<<endl;
}
Test(const Test&t)
{
this->data=t.data;
cout<<"Test Copy"<<endl;
}
};


vector<Test> fun()
{
vector<Test>can;
Test t;
t.data=12;
can.push_back(t);


vector<Test>can2=can;//测试第一个拷贝构造函数


return can;
}


int main()
{
vector<Test> can=fun();//测试第二个拷贝构造函数
}


希望大家指出其中的错误,非常感谢

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑网页默认了怎么办 淘宝商家停止服务怎么办? 淘宝商家停止了怎么办 做淘宝不会美工怎么办 做客服打字慢怎么办 淘宝客服学不会怎么办 代购不给退货怎么办 淘宝不能发照片怎么办 兼职刷手被骗怎么办 淘宝店商品被降权怎么办 淘宝宝贝被降权了怎么办 淘宝违规降权怎么办 淘宝商品降权怎么办 公司不想要了怎么办 派派被客服禁言怎么办 淘宝收款不发货怎么办 新品标签没了怎么办 商家签收不退款怎么办 微信号存在风险怎么办 建网站不会管理怎么办 淘宝代销厂家发错货卖家怎么办 来分期退货退款怎么办 淘宝售后不退货怎么办 手机淘宝不退货怎么办 淘宝店不肯退款怎么办 退货快递丢件怎么办 淘宝客服不退款怎么办 淘宝被拉进黑名单怎么办 被买家举报假货怎么办 淘宝店售假3次怎么办 支付宝被骗200怎么办 淘宝被同行投诉怎么办 淘宝同行恶意投诉怎么办 淘宝被恶意举报怎么办 买到假的gucci包怎么办 淘宝买家退假货怎么办 淘宝产品被投诉怎么办 淘宝店铺被盗了怎么办 淘宝卖家不给解决问题怎么办 淘宝直通车亏钱怎么办 买家一直不评论怎么办