当前位置: 首页 > 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://www.sadfv.cn/news/317003/

相关文章:

  • 网站开发推进计划表网页设计标准的尺寸是多少
  • asp.net 旅游网站开发做网站应该注意些什么问题
  • 怎么在网上免费做公司网站可以看帖子的网站
  • 网站规划与设计大作业html对于网站
  • 公司做网站的费用怎么入账科技风格网站
  • 网站建设xm3730天网站建设实录教程
  • 网站押金收回怎么做分录博客网页制作代码
  • 网站的技术建设厦门网站建设ui
  • 深圳网站平台哪家强网站代运营公司排名
  • 一键免费生成网页的网站积极推进政务网站建设
  • 新的龙岗网站建设百度指数官网
  • 网站右下角广告展示代码网页制作与网站建设的题
  • 英语网站建设费用wordpress后台下载
  • 北京网站开发费用如何制作网站专题
  • 广西南宁小程序开发公司西安seo服务商
  • wordpress网站统计代码放哪个文件wordpress ping大全
  • 站长工具seo综合查询分析网站策划建设方法
  • 柯桥建设局网站首页wordpress侧边栏模块
  • 网站建站的基本步骤增加wordpress插件
  • 手袋东莞网站建设珠海建设网站的公司简介
  • 平顶山营销型网站建设手机端seo
  • 政务网站的建设方案一个网站做多少关键词
  • 网站建设的大作业代码北京搬家公司排名
  • 网站做成app个人证件查询
  • 自学网站建设工资最近的新闻摘抄
  • 网站模板下北京做网站建设
  • 模块化网站开发在wordpress上添加
  • 职场seo是什么意思wordpress 缩略图优化
  • 网站服务器做缓存wordpress文章标题高亮插件
  • 小说网站开发业务逻辑山东省建设教育集团网站