c – 如何使用在函数中本地创建的对象而不将其复制到内存中?

例如,我有一个类在其consturctor中调用一个返回本地对象的函数.我正在尝试使用rvalue引用来访问此对象,以避免在内存中进行昂贵的移动.

   class MyClass
    {
        BigObject&& C;
        MyClass() : C(f())
        {
        };
    };
   BigObject f()
   {
       return BigObject();
   }

但是compiller告诉我,引用成员被初始化为一个临时的,在构造退出后不会持续存在.

我不明白.我理解在函数范围内创建的本地对象仅存在于函数范围内.到达范围的末尾 – 调用本地对象的析构函数.在这里,我用本地对象初始化rvalue引用,并且我可以访问它,而我在constuctor的主体中.

有人可以解释一下,这里发生了什么?有没有办法返回一个本地对象并将其用作任何ligetable类成员,而不是在内存中移动它?

解决方法:

你应该删除&&来自C.

代码并不像您想象的那么昂贵:f的返回值是copy elision上下文.因此,允许编译器直接在C的内存空间中构造单个BigObject.即使编译器不执行此操作,它仍然是移动上下文,因此最坏情况下对象将被移动.

如果你的对象以某种方式可复制但不可移动,那么你必须依赖复制省略,但很难想象这样一个对象的有效用例.

上一篇:建议104:用多态代替条件语句


下一篇:每囸推歌