首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回对象副本的C++

返回对象副本的C++
EN

Stack Overflow用户
提问于 2012-05-30 14:26:03
回答 3查看 200关注 0票数 6

我编写了以下代码:

代码语言:javascript
运行
复制
class MyObjectHolder {
public:
    std::vector<int> getMyObject() const {
        return myObject;
    }

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

在程序的某个时候,我尝试使用getMyObject方法,并且只对检索到的对象使用const方法:

代码语言:javascript
运行
复制
const std::vector<int> myObject = myObjectHolder.getMyObject();
myObject.size();
int a = myObject.front();
  • 现在,编译器是否有可能优化这段代码,以便不执行std::vector<int>副本? 是否有可能编译器确定我只对检索到的对象使用const方法(让我们假设在它后面没有发生mutable胡说八道),并且它不会复制对象的任何副本,而是对MyObjectHolderprivate成员执行这些const操作?
  • 如果是,如果我没有显式声明const std::vector<int> myObjectconst,是否有可能
  • 若否,有何理由不这样做?在这种情况下,这个优化将很难实现/推断它是可能的和正确的在这里/.?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-30 14:31:26

现在,编译器是否可能优化这段代码,这样就不会执行std::vector<int>的副本了?

不,编译器不知道调用者将如何处理该对象,除非您正在对所有使用该对象的代码进行全局优化(编译器通常不能对其使用作出假设;而且,如果对象是从dll导出的,那么它根本不能做任何假设)。

如果是,如果我没有显式声明const::vector为const,是否有可能?

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

若否,有何理由不这样做?在这种情况下,这个优化将很难实现/推断它是可能的和正确的在这里/.?

这是一个应该在getMyObject()内部完成的优化,但是编译器不能确定调用者不会丢弃const。实际上,这是关于const使用的一个非常古老的争论,通常我认为更清楚的是,总是把const看作程序员的事情,而不是编译器的问题。

票数 6
EN

Stack Overflow用户

发布于 2012-05-30 14:31:16

我建议你用

代码语言:javascript
运行
复制
const std::vector<int>& getMyObject() const {
    return myObject;
}

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

并将结果与

代码语言:javascript
运行
复制
const std::vector<int>& myObject = myObjectHolder.getMyObject();
票数 3
EN

Stack Overflow用户

发布于 2012-06-27 09:33:45

复制省略返回值优化可能会加入进来。如果将C++编译器与C++11支持结合使用,则可以通过移动语义对其进行优化。

我建议阅读由Dave撰写的优秀文章想要速度吗?按值传递,并在下面的评论中进行讨论。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10818278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档