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

保险网站建设的目标西城区网站建设推广seo

保险网站建设的目标,西城区网站建设推广seo,怎么进行网站开发,平台公司组建方案背景: 最近看了候捷老师的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.hkea.cn/news/14456155/

相关文章:

  • 许昌市住房和城乡建设局网站雄安建设投资集团网站
  • 建分类网站得花多少钱百度网页版官网首页
  • jetty网站开发烟台学校网站建设
  • 嘉祥网站建设wordpress数据库邮箱
  • 南京市城市建设档案馆网站做别人公司的网站违法吗
  • 郑州上街区网站建设公司手机网站模板 餐饮
  • 站长推荐产品建个网站找
  • 做彩铃的网站网站的风格
  • 有个印度做网站的天天找我东营做网站优化哪家好
  • 创建游戏网站邯郸做网站的电话
  • 织梦网站后台地址设计网站printerest
  • 企业建设网站的策划流程湘潭百度推广
  • 网站建设公司广告 晴天娃娃网站被k如何恢复
  • 百度网站app职业生涯规划大赛项目名称
  • 孟村县做网站价格网站的建设及推广
  • 做微信小程序的网站佛山做外贸网站
  • 深圳31设计seo推广怎么样
  • 如何网站做专题自己建网站难吗
  • 网站策划怎么样建筑业企业
  • 软件开发 网页设计网站名字设计logo图片
  • 云南建设网站2023全民核酸又开始了
  • wix做的免费网站可以用吗wordpress文章前阅读
  • 网站搭建步骤百度云网盘入口
  • 电商网站建设与维护建设网站公司 昆山
  • 怎么查网站的域名备案滕州市做淘宝网站的
  • 大型门户网站建设需要哪些技术和注意事项安卓优化大师下载安装到手机
  • 酒店网站建设范文网站用户运营
  • 创新的响应式网站建设物联网开发软件有哪些
  • dw做网站首页百度扫一扫网页版
  • 石家庄营销网站建设多少钱河北定制网站建设调试