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

大理市政府建设办网站百度贴吧热线客服24小时

大理市政府建设办网站,百度贴吧热线客服24小时,网络营销是什么 能做什么,手机怎么做微信公众号本文中部分内容来自下面的文章,还有一部分来自智谱清言 C 返回值优化_c 局部变量返回优化-CSDN博客 elision:省略 copy elision:拷贝省略 RVO (Return Value Optimization):返回值优化 ------ 我最近也遇到了上面博文中说到的问题&…

本文中部分内容来自下面的文章,还有一部分来自智谱清言 

C++ 返回值优化_c++ 局部变量返回优化-CSDN博客

elision:省略

copy elision:拷贝省略

RVO (Return Value Optimization):返回值优化

------

我最近也遇到了上面博文中说到的问题:

观察这段代码:

std::vector<int> f() {std::vector<int> v;// do some thing with vreturn v;
}std::vector<int> test = f();

------

在C++中,当返回一个局部对象时,会发生以下事情:

拷贝返回:默认情况下,返回局部对象时,会通过拷贝构造函数创建返回值的副本

这意味着在函数返回后,局部对象被销毁,但是它的副本会被用来初始化调用处的变量

------

在这个例子中,返回局部对象v时,会通过拷贝构造函数创建返回值的副本[假设是temp]

这意味着在函数返回后,局部对象 v 被销毁,但是它的副本temp会被用来初始化调用处的变量test

------

移动语义(C++11及以后版本)

如果编译器支持返回值优化(RVO,Return Value Optimization)或者具名返回值优化(NRVO,Named Return Value Optimization),那么在返回 v 时,编译器可能会直接在调用者作用域构造 test,从而避免了额外的拷贝。

如果 std::vector<int> 支持移动构造函数,编译器还可能会使用移动语义,这意味着 v 的资源(如动态分配的内存)会被移动到 test 中,而不是复制,从而提高效率。

------ 

拷贝返回的话,共调用了1次构造函数,2次拷贝构造函数:

  1. 一次构造函数调用:在函数 f() 内部,std::vector<int> v; 这行代码会调用 std::vector<int> 的默认构造函数来创建局部对象 v

  2. 两次拷贝构造函数调用

    • 第一次是在 return v; 语句执行时,这时会创建一个 v 的副本,用于返回给函数的调用者
    • 第二次是在函数外部接收返回值时,即 std::vector<int> test = f(); 这行代码,这里 test 通过拷贝构造函数使用 f() 返回的 v 的副本[假设是temp]来初始化。

------ 

值得注意的是,现代C++编译器通常会应用返回值优化RVO)或具名返回值优化NRVO),在这种情况下,编译器可能会优化掉不必要的拷贝。

------

如果编译器能够应用这种优化,那么实际上可能只会有一次构造函数调用,即使是在返回局部对象时。在这种情况下,编译器会在调用者作用域直接构造 test,而不是在函数内部创建一个副本[假设是temp]然后拷贝它。

------

例如,如果编译器应用了RVO/NRVO,那么上面的代码在优化后的汇编代码中,可能会直接在 test 的位置构造 std::vector<int>,从而避免了额外的拷贝。

如果 std::vector<int> 支持移动语义(在C++11及以后版本中),编译器还可能会使用移动构造函数来进一步提高效率。

---------

对于上面的例子,通过返回值优化(RVO)或具名返回值优化(NRVO),编译器可以省略掉两次不必要的拷贝构造函数调用,只会调用一次构造函数。

具体来说:

  • RVO(Return Value Optimization):当编译器检测到函数返回的是一个局部对象,并且该局部对象是直接返回的没有经过任何中间步骤),编译器可能会直接在调用者的栈上构造这个对象,而不是在函数内部构造然后再拷贝。

  • NRVO(Named Return Value Optimization):这是RVO的一种特殊情况,当返回的局部对象有名字时,编译器可能会使用NRVO。

------

对于上面的示例,我猜:会使用NRVO:

编译器检测到函数返回的是局部对象v,并且该局部对象是直接返回的没有经过任何中间步骤),编译器会直接在调用者的栈上构造对象test,而不是在函数内部构造v然后再拷贝到temp再拷贝到test

------

如果没有应用RVO/NRVO,但编译器支持移动语义(C++11及以后版本),

并且 std::vector<int> 支持移动构造函数,那么编译器可能会使用移动构造函数来代替拷贝构造函数,这样仍然可以避免拷贝,但会调用一次移动构造函数。在这种情况下,总共会有一次构造函数调用一次移动构造函数调用

------

移动构造函数在何时被调用?

当对象即将被销毁,并且其资源可以被移动到另一个对象时

在函数 f() 返回局部对象 v 时,局部对象 v 将要离开其作用域并被销毁

如果此时 v 的资源(如动态分配的内存)可以被移动而不是复制,那么编译器会调用移动构造函数来将 v 的资源移动到将要接收返回值的对象test中。

------

总结:

  • 如果编译器应用了RVO/NRVO:总共一次构造函数调用。
  • 如果编译器没有应用RVO/NRVO,但使用了移动语义:总共一次构造函数调用和一次移动构造函数调用。
  • 如果编译器既没有应用RVO/NRVO,也没有使用移动语义:总共一次构造函数调用和两次拷贝构造函数调用。不过,在现代编译器中,这种情况不太可能发生,因为它们通常会利用RVO/NRVO或移动语义来优化代码。

------

http://www.hkea.cn/news/648919/

相关文章:

  • 石家庄java开发做网站百度资源站长平台
  • 有哪些网站系统网络营销首先要进行
  • 网站建设硬件设置竞价广告是怎么推广的
  • 网站的平面设计图用ps做国外搜索引擎大全百鸣
  • 深圳专业企业网站建设前端培训
  • 南京平台公司seo搜索培训
  • 横沥网站建设武汉百度百科
  • 百度给做网站公司线上运营的5个步骤
  • 盘锦网站建设公司网络营销策略包括哪些
  • 简述电子商务网站开发的基本原则一站式网络营销
  • 商丘网站网络推广员的工作内容和步骤
  • 取消wordpress邮箱认证北京搜索优化排名公司
  • 千库网素材南宁seo优势
  • 西安机场商务宾馆百度做网站怎么在百度上做网站
  • ps网站建设seo网络公司
  • 网站建设步骤 教 程网站怎么做谷歌推广
  • 网站制作需要注意什么潍坊做网站哪家好
  • 专门做团购的网站有哪些色盲图
  • 百度做网站续费费用百度营业执照怎么办理
  • 深圳网站建设方维网络企业网站制作要求
  • 制作好网站黑帽seo教程
  • 云南 网站建设网站seo优化对网店的推广的作用为
  • 网站建设免费国外舆情服务公司
  • 怎么做网站banner查排名网站
  • 做网站好看的背景图片相关搜索优化软件
  • 怎么查网站是哪家制作公司做的百度收录查询
  • 企业年金交了有好处吗网络优化工程师吃香吗
  • python做网站开发百度6大核心部门
  • 自己做网站平台企业网站优化价格
  • 淘宝网网站建设的需求分析百度会员登录入口