6

我写了以下代码:

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

private:
    std::vector<int> myObject;
};

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

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

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

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

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

4

3 回答 3

6

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

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

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

不,无论如何,从非常量到常量的转换可能是隐式的。

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

这是一个应该在内部完成的优化,getMyObject()但编译器不能确定调用者不会丢弃 const。实际上,这是一个关于使用的非常古老的辩论const,通常我认为始终将const其视为程序员而不是编译器会更清楚。

于 2012-05-30T14:31:26.163 回答
3

我建议使用

const std::vector<int>& getMyObject() const {
    return myObject;
}

它将返回 myObject 的常量引用而不复制它。

并将结果与

const std::vector<int>& myObject = myObjectHolder.getMyObject();
于 2012-05-30T14:31:16.930 回答
0

复制省略返回值优化可能会启动。如果您使用支持C++11的 C++ 编译器,那么您可以通过移动语义对其进行优化。

我建议阅读优秀的文章想要速度?Dave Abrahams通过价值传递,并在下面的评论中进行讨论。

但是,有关详细信息,您应该参考 C++ 编译器的文档。

于 2012-06-27T09:33:45.110 回答