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它背后没有发生废话)并且它不会制作对象的任何副本并const在private成员上执行这些操作的MyObjectHolder呢?
如果是的话,如果我没有明确声明为const std::vector<int> myObjectas ,是否可能const?
如果不是,不这样做的原因是什么?在这种情况下,这种优化将难以实现/推断它可能并在这里更正/等...?
现在,编译器是否可能优化此代码以便不执行任何副本
std::vector<int>?
不,编译器不知道调用者将对该对象做什么,除非您对使用该对象的所有代码使用全局优化(编译器通常不能对其使用进行假设;此外,如果对象是从dll它根本不能做出任何假设.
如果是,如果我没有明确地将const std :: vector myObject声明为const,是否可能?
不,无论如何,从非const到const的转换可能是隐含的.
如果不是,不这样做的原因是什么?在这种情况下,这种优化将难以实现/推断它可能并在这里更正/等...?
这是一个应该在内部完成的optmiziation,getMyObject()但编译器不能确定调用者不会抛弃const.实际上这是关于使用的一个非常古老的争论const,通常我认为总是把它想象const成程序员而不是编译器.