C++返回一个对象副本

Yip*_*Yay 6 c++ optimization copy copy-constructor rvo

我写了以下代码:

class MyObjectHolder {
public:
    std::vector<int> getMyObject() const {
        return myObject;
    }

private:
    std::vector<int> myObject;
};
Run Code Online (Sandbox Code Playgroud)

在我的程序的某些时候,我尝试使用该getMyObject方法并仅const在检索到的对象上使用方法:

const std::vector<int> myObject = myObjectHolder.getMyObject();
myObject.size();
int a = myObject.front();
Run Code Online (Sandbox Code Playgroud)
  • 现在,编译器是否可能优化此代码以便不执行任何副本std::vector<int>

    是否有可能编译器确定我只使用const检索到的对象上的方法(并且假设mutable它背后没有发生废话)并且它不会制作对象的任何副本constprivate成员上执行这些操作的MyObjectHolder呢?

  • 如果是的话,如果我没有明确声明为const std::vector<int> myObjectas ,是否可能const

  • 如果不是,不这样做的原因是什么?在这种情况下,这种优化将难以实现/推断它可能并在这里更正/等...?

Adr*_*tti 6

现在,编译器是否可能优化此代码以便不执行任何副本std::vector<int>

不,编译器不知道调用者将对该对象做什么,除非您对使用该对象的所有代码使用全局优化(编译器通常不能对其使用进行假设;此外,如果对象是从dll它根本不能做出任何假设.

如果是,如果我没有明确地将const std :: vector myObject声明为const,是否可能?

不,无论如何,从非const到const的转换可能是隐含的.

如果不是,不这样做的原因是什么?在这种情况下,这种优化将难以实现/推断它可能并在这里更正/等...?

这是一个应该在内部完成的optmiziation,getMyObject()但编译器不能确定调用者不会抛弃const.实际上这是关于使用的一个非常古老的争论const,通常我认为总是把它想象const成程序员而不是编译器.