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

易企cms网站模板使用html5做语音标注网站

易企cms网站模板,使用html5做语音标注网站,短视频营销获客系统,泰安网站建设找工作背景: 最近看了候捷老师的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/47368/

相关文章:

  • 有没有做博物馆的3d网站泰安人才网官方网
  • 请问网上有没有比较好的网站可以做照片书的呀?要求质量比较好的!网络营销渠道的功能包括
  • 内蒙古建设工程造价信息网官方网站优化大师是什么意思
  • 旅游网站开发需求百元建网站
  • 衡水企业做网站推广哪些网站可以找到兼职做报表的
  • 小程序跳转到网站电商网站开发与运营
  • 做pc网站会连带手机版网站确定关键词 如何做
  • 贵阳市 网站建设wordpress个人简历
  • 自己做的网站别人怎么做精准引流推广
  • 电脑网站推荐天眼在线查企业查询系统
  • 国家和住房城乡建设部网站郑州十大最有名的公司
  • 网站的收录情况怎么查网络架构设计方案
  • 推荐o2o网站建设建个网站多少费用
  • 网站制作的详情表水陆运输类网站如何建设
  • 简单的网站源码公司装修费用可以一次性入账吗
  • 网站空间哪家做的好单位网站链接怎样做
  • 怎么建设手机网站一般建设网站大概需要多少钱
  • 网站开发 chrome浏览器崩溃潍坊网站建设设计
  • wordpress弹幕播放器关键词优化公司费用多少
  • 如何建设电影网站wordpress 打赏
  • 织梦发布网站门户网站模块
  • seo网站关键词优化工具网站关键词在哪里修改
  • 优化网站seo广州天河区小学排名
  • 阳江企业网站建设王也道长头像
  • 北京企业官网网站建设哪家好泉州网站建设公司招聘销售
  • 重庆做网站开发的公司安全工程师证报考条件是什么
  • 南阳网站制作价格门户网站自查报告
  • 阿里云建站售前咨询hk域名网站
  • 网站建设情况总结旅游网站效果图
  • 最好网站开发公司电话网页设计类型与风格