相关疑难解决方法(0)

什么是复制省略和返回值优化?

什么是复制省略?什么是(命名)返回值优化?他们意味着什么?

它们会在什么情况下发生?有什么限制?

c++ optimization c++-faq return-value-optimization copy-elision

350
推荐指数
4
解决办法
7万
查看次数

在函数中返回大对象

比较以下两段代码,第一段使用对大对象的引用,第二段使用大对象作为返回值.对"大对象"的强调指的是不必要地重复对象的副本是浪费的循环.

使用对大对象的引用:

void getObjData( LargeObj& a )
{
  a.reset() ;
  a.fillWithData() ;
}

int main()
{
  LargeObj a ;
  getObjData( a ) ;
}
Run Code Online (Sandbox Code Playgroud)

使用大对象作为返回值:

LargeObj getObjData()
{
  LargeObj a ;
  a.fillWithData() ;
  return a ;
}

int main()
{
  LargeObj a = getObjData() ;
}
Run Code Online (Sandbox Code Playgroud)

第一段代码不需要复制大对象.

在第二个片段中,对象是在函数内部创建的,因此通常在返回对象时需要复制.但是,在这种情况下,main()正在声明对象.编译器是否会首先创建一个默认构造的对象,然后复制返回的对象getObjData(),或者它是否与第一个片段一样有效?

我认为第二个片段更容易阅读,但我担心效率会降低.

编辑:通常,我认为案例LargeObj是通用容器类,为了参数,它们包含数千个对象.例如,

typedef std::vector<HugeObj> LargeObj ;
Run Code Online (Sandbox Code Playgroud)

所以直接修改/添加方法LargeObj不是一个可直接访问的解决方案.

c++

40
推荐指数
2
解决办法
7240
查看次数