rvo相关内容

为什么 g++ 在这里不启用 RVO?

考虑一下测试代码: #include 使用命名空间标准;类{上市:克拉斯(){cout 通俗地说,[C++11: 12.8/31] 的以下条件不满足 在具有类返回类型的函数的返回语句中,当表达式是非易失性自动对象的名称(不是function 或 catch-clause parameter) 具有与函数返回类型相同的 cv-unqualified 类型,则可以通过将自动对 ..
发布时间:2022-01-23 20:53:31 C/C++开发

基于作用域的锁守卫和返回值的时间安排

class C {可变 std::mutex _lock;映射深成员;上市:自动 get_big_lump(){std::unique_lock锁(_锁);//建立范围保护返回 deep_member;//复制内容,而不能在另一个线程上更改.}}; 关于守卫和复制返回值的保证时间是多少?复制是否会在持有锁时进行,或者在允许(或实际!)优化的情况下,是否可以在函数体返回后进行一些复制? 解决 ..
发布时间:2022-01-04 11:40:00 C/C++开发

为什么 Visual Studio 在这种情况下不执行返回值优化 (RVO)

我正在回答 一个问题并推荐按值返回大类型 因为我相信编译器会执行 返回值优化 (RVO).但是后来有人向我指出 Visual Studio 2013 没有对我的代码执行 RVO. 我发现 这里有一个问题关于 Visual Studio 未能执行 RVO,但在这种情况下,结论似乎是如果真的很重要,Visual Studio 将执行 RVO.就我而言,它确实很重要,它对性能产生了重大影响,我已经 ..
发布时间:2021-12-31 13:34:49 C/C++开发

c++11 返回值优化还是移动?

我不明白什么时候应该使用 std::move 以及什么时候应该让编译器优化...例如: 使用 SerialBuffer = vector;//让编译器优化它SerialBuffer 读取( size_t size )const{SerialBuffer 缓冲区(大小);读取(开始(缓冲区),结束(缓冲区));//返回值优化返回缓冲区;}//显式移动SerialBuffer 读取( size_t ..
发布时间:2021-12-01 15:36:44 C/C++开发

基于范围的锁保护和返回值的时间

C类{ 可变std :: mutex _lock; map deep_member; public: auto get_big_lump() { std :: unique_lock锁(_lock); //建立范围守护 return deep_member; //复制内容,但无法在其他线程上进行更改。 } }; ..
发布时间:2020-09-27 04:39:10 C/C++开发

C ++ 17中具有不可移动类型和保证的RVO的多个返回值(结构化绑定)

对于C ++ 17,我们将有可能返回可以移动的(包括不可复制的)类型,例如 std :: mutex ,这可以被认为是保证的返回值。优化(RVO):通过简化的值保证了复制省略类别: struct nocopy {nocopy(nocopy&)= delete; nocopy()=默认值; }; auto getRVO(){ return nocopy(); } 我 ..
发布时间:2020-06-02 20:31:31 C/C++开发

C ++编译器会优化返回值代码吗?

假设我使用Visual Studio或现代GCC与-O2。将编译器创建 S 里面 func(),然后将其复制到 my_result ,否则将创建 my_result 与构造函数(5,6,5 + 6) S ? 注意: ()定义及其用法在单独的.obj文件中! struct S { S(int _x,int _y,int _z):x(_x),y(_y),z(_z){} int ..
发布时间:2016-10-20 21:58:23 C/C++开发

为什么在返回参数时不允许RVO?

在[C ++ 11:12.8 / 31]中说明: 这种复制/移动操作,is permitted [...]: - 在具有类返回类型的函数的返回语句中,当表达式是非易失性自动对象(除了函数或catch子句参数之外)具有与函数返回类型相同的cv非限定类型,可以通过将自动对象直接构造为函数的return来省略复制/移动操作值 这意味着 #include ..
发布时间:2016-10-14 10:10:46 C/C++开发

为什么std :: move会阻止RVO?

在许多情况下,从函数返回一个局部,RVO踢。但是,我认为显式使用 std :: move 将至少强制移动当RVO不会发生,但RVO仍然应用,如果可能的话。但是,似乎并非如此。 #include“iostream” class HeavyWeight { public: HeavyWeight() { std :: cout ..
发布时间:2016-10-13 12:13:25 C/C++开发