当前位置: 首页 > news >正文

网站能搜索到做器材的网站

网站能搜索到,做器材的网站,网站备案连接,温州哪里做网站比较好背景: 最近看了候捷老师的c的教程, 他说移动构造方法要加noexcept, 在vector扩容的时候, 如果有移动构造方法没有加noexcept,是不会调用的. 个人感觉有些神奇, 这就去查下一探究竟. 过程: 测试代码如下: #include iostream #include vector struct A {A(){s…背景: 最近看了候捷老师的c的教程, 他说移动构造方法要加noexcept,  在vector扩容的时候, 如果有移动构造方法没有加noexcept,是不会调用的. 个人感觉有些神奇, 这就去查下一探究竟. 过程: 测试代码如下: #include iostream #include vector struct A {A(){std::coutA::A()std::endl;}A(const A a){std::coutA::A(const Aa)std::endl;}A(A a) {std::coutA::A(A a)std::endl;}A operator(const Aa) {std::coutoperator(const Aa)std::endl;return *this;}A operator (A a){std::coutoperator (Aa)std::endl;return *this;} }; int main() {std::vectorA vecA;A a;vecA.push_back(a);std::cout1std::endl;vecA.push_back(a);std::cout2std::endl;vecA.push_back(a);std::cout3std::endl;vecA.push_back(a);std::cout4std::endl;return 0;} 执行结果如下: A::A() A::A(const Aa) 1 A::A(const Aa) A::A(const Aa) 2 A::A(const Aa) A::A(const Aa) A::A(const Aa) 3 A::A(const Aa) 4 我们知道vector 是要扩容的, 在A(A a) 并没有添加noexcept关键字, 所以扩容的时候,使用的也是拷贝构造方法, 那接下来我们看下加下 noexcept 后了,结果是什么样的 #include iostream #include vector struct A {A(){std::coutA::A()std::endl;}A(const A a){std::coutA::A(const Aa)std::endl;}A(A a) noexcept{std::coutA::A(A a)std::endl;}A operator(const Aa) noexcept{std::coutoperator(const Aa)std::endl;return *this;}A operator (A a){std::coutoperator (Aa)std::endl;return *this;} }; int main() {std::vectorA vecA;A a;vecA.push_back(a);std::cout1std::endl;vecA.push_back(a);std::cout2std::endl;vecA.push_back(a);std::cout3std::endl;vecA.push_back(a);std::cout4std::endl;return 0;} 执行结果如下: A::A() A::A(const Aa) 1 A::A(const Aa) A::A(A a) 2 A::A(const Aa) A::A(A a) A::A(A a) 3 A::A(const Aa) 4 在A(A a) noexcept 后, 调用的方法就是移动构造方法, 感觉挺不可思议的, 带着这个疑问,我们看下std::vector 源码来找寻答案 揭秘: push_back 源码如下: template class _Tp, class _Allocator inline _LIBCPP_INLINE_VISIBILITY void vector_Tp, _Allocator::push_back(const_reference __x) {if (this-__end_ ! this-__end_cap()){__RAII_IncreaseAnnotator __annotator(*this);__alloc_traits::construct(this-__alloc(),_VSTD::__to_raw_pointer(this-__end_), __x);__annotator.__done();this-__end_;}else__push_back_slow_path(__x); } 因为我们要看扩容相关的代码,  __push_back_slow_path(__x); 对应的需要扩容要调用的代码 #ifndef _LIBCPP_CXX03_LANG vector_Tp, _Allocator::__push_back_slow_path(_Up __x) #else vector_Tp, _Allocator::__push_back_slow_path(_Up __x) #endif {allocator_type __a this-__alloc();__split_buffervalue_type, allocator_type __v(__recommend(size() 1), size(), __a);// __v.push_back(_VSTD::forward_Up(__x));__alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_), _VSTD::forward_Up(__x));__v.__end_;__swap_out_circular_buffer(__v); } 上边是分配内从,我们重点看下__swap_out_circular_buffer(__v);  把老的元素拷贝新的申请区域上 template class _Tp, class _Allocator void vector_Tp, _Allocator::__swap_out_circular_buffer(__split_buffervalue_type, allocator_type __v) {__annotate_delete();__alloc_traits::__construct_backward(this-__alloc(), this-__begin_, this-__end_, __v.__begin_);_VSTD::swap(this-__begin_, __v.__begin_);_VSTD::swap(this-__end_, __v.__end_);_VSTD::swap(this-__end_cap(), __v.__end_cap());__v.__first_ __v.__begin_;__annotate_new(size());__invalidate_all_iterators(); } 在看下__alloc_traits::__construct_backward 这块 代码 template class _Ptr_LIBCPP_INLINE_VISIBILITYstaticvoid__construct_backward(allocator_type __a, _Ptr __begin1, _Ptr __end1, _Ptr __end2){while (__end1 ! __begin1){construct(__a, _VSTD::__to_raw_pointer(__end2-1), _VSTD::move_if_noexcept(*--__end1));--__end2;}} 代码看到这里,基本已经水落石出了, 我们看到上边有一个很关键的代码_VSTD::move_if_noexcept(*--__end1), 从字面意思也能看出来它是什么意思, 接着看下它的源码 emplate class _Tp inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11typename conditional !is_nothrow_move_constructible_Tp::value is_copy_constructible_Tp::value,const _Tp,_Tp ::typemove_if_noexcept(_Tp __x) _NOEXCEPT {return _VSTD::move(__x); }这块代码就比较复杂了, move_if_noexcept 返回值使用了SFINA的技术,  conditional是一个条件判断语句, 如果它第一类型是true, 则返回const_TP, 如果是false 则返回类型 _Tp , 那就看下!is_nothrow_move_constructible_Tp::value  is_copy_constructible_Tp::value 这个到底表达什么意思, 从标准库源代码is_nothrow_move_constructible_Tp::value 是判断_TP这个类型是否有不抛一场的移动构造方法, is_copy_constructible_Tp::value 并且拷贝构造方法,  源码看到这里大家心里就很清楚了, 到底咋回事!
http://www.zqtcl.cn/news/69165/

相关文章:

  • 黑龙江省建设集团有限公司网站个人建设网站维护费是多少
  • 好网站建设公司服务电子书推送网站怎么做
  • 唐山网站建设设计做外贸网站空间多少g
  • 京东网站的设计风格代做毕业设计网站有哪些
  • 自己家的电脑做网站需要备案没网站建设有前景吗
  • wordpress本地做好如何改站点地址php网站开发 薪资 东莞
  • 一般vs做的网站的总体框架郑州网站建设幸巴
  • 手机版网站设计邯郸哪里可以学建网站
  • 西安模板建站公司强大的wordpress 二次开发
  • 南宁高端网站建设公司微信如何申请小程序商店
  • 溧阳企业网站建设价格广州市建设和水务局网站
  • 兰州网站运营广告制作与设计专业
  • 为什么有网网站打不开怎么回事住房城乡建设证书查询
  • 搭建个人博客网站排名优化系统
  • 知名中文网站建设网站注册搜索引擎的目的
  • 长春企业建站平台客厅装修效果图片大全
  • 网站建设最便宜高德地图网页版
  • 辽宁做网站的公司竞价单页网站制作教程
  • 深圳微商城网站设计电话祥云平台技术支持双语网站
  • 邢台网站建设网络优化恋家网邯郸房产
  • 单位网站建设的重要性用什么软件做购物网站
  • 安庆做网站企业浙江省建设局网站
  • 网站的交互怎么做沈阳工程信息造价网
  • 中国建筑网建设通进行查询证件查询网站优化宝
  • 建设阿里巴巴网站首页做招聘网站的怎么让人注册简历
  • 南宁网站建设nnit30做一个网站要什么样技术
  • 公司网站备案网址南昌金启网站建设
  • 网站开发都是模板阿里云可以做电商网站吗
  • 外管局网站上做存量权益登记个人网页制作与网站建设
  • asp网站做视频高质量的南昌网站建设