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

嘉兴网站建设有前途吗手机购物网站 建站

嘉兴网站建设有前途吗,手机购物网站 建站,ui设计培训怎么样,网站关键词怎么优化排名背景: 最近看了候捷老师的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://wiki.neutronadmin.com/news/317003/

相关文章:

  • 优秀网站设计百度关键字
  • 设计网站建设合同书建设一个同城购物网站
  • 手机软件开发和网站开发含山县查询建设工程的网站
  • 保山公司网站建设淘宝优惠券网站怎么做
  • 网红营销网站免费网站后台管理系统html
  • 广州建网站公司排名浙江省杭州市建设厅网站
  • 对网站建设的要求wordpress中文是什么?
  • vps设置网站访问用户权限js代码 嵌入网站
  • 有什么网站建设软件有哪些网站维护运营好做吗
  • 如何搭建公司内部网站wordpress 邮件通知
  • dede批量建站网页qq登录不了怎么回事
  • 如何进入正能量奖励网站摄影官网
  • 一级a做爰片凤凰网站沈阳网站设计定制
  • 网站欢迎页面在线设计太原网站建设的公司
  • 网站推广策划案格式及范文黄骅旅游景点大全
  • 网站建设中的思想和算法公关公司官网
  • 扬州建设教育信息网站大气好看的网站
  • 手把手教做网站做个什么网站
  • 如何做关于网站推广的培训广西医院的网站建设
  • 网站用什么做美橙网站产品详情
  • 聚来宝网站建设wordpress插件 标签页
  • 手机工信部网站备案查询足球比赛直播阿根廷
  • 乐清 网站建设有了域名如何建网站
  • 创建网站app客户做外贸用那些网站
  • 做企业网站服务器做网站能成功吗
  • 网络营销师培训课程seo排名教程
  • 网站建设店网站可以跟博客做互链吗
  • 网站 502错误电子商务网站与建设实践报告
  • 政务公开网站建设网站tag设计
  • 家居行业网站建设wordpress主题6