泛型编程-转移构造函数(Generic Programming: Move Constructor)

http://tech.ddvip.com   2007年03月16日    社区交流

本文详细介绍泛型编程-转移构造函数(Generic Programming: Move Constructor)

3 过去的解决方案

  不必要的复制是C++社区长期存在的问题。有两个努力方向齐头并进,其一是从编码和库编写的角度,另一个是语言定义和编译器编写层面。

  语言/编译器观点方面,有返回值优化(Return Value Optimization, RVO)。RVO被C++语言定义所允许[3][译注:但是不是强制性的,而是实现定义的]。基本上,编译器假定通过拷贝构造函数(Copy Constructor)复制返回值。

  确切地说,基于这样的假定,因此编译器可以消除不必要的复制。例如,考虑:

vector< String > ReadFile()
{
  vector< String > result;
  //...填充result...
  return result;
}
vector< String > vec=ReadFile();

  聪明的编译器可以将vec的地址作为一个隐藏的参数传递给ReadFile而把result创建在那个地址上。所以上面的源代码生成的代码看起来像这样:

void ReadFile(void* __dest)
{
  //使用placement new在dest地址创建vector
  vector< String >& result=
    *new(__dest) vector< String >;
  //...填充result...
}
//假设有合适的字节对齐
char __buf[sizeof(vector< String >)];
ReadFile(__buf);
vector< String >& vec=
  *reinterpret_cast < vector< String >* >(__buf);

  RVO有不同的风格,但要旨是相同的:编译器消除了一次拷贝构造函数的调用,通过简单的在最终目的地上构造函数返回值。

  不幸的是,RVO的实现不像看上那样容易。考虑ReadFile稍稍修改后的版本:

vector< String > ReadFile()
{
  if (error) return vector< String >();
  if (anotherError)
  {
    vector< String > dumb;
    dumb.push_back("This file is in error.");
    return dumb;
  }
  vector< String > result;
  //...填充result...
  return result;
}

  ******************************************************

作者:Andrei Alexandrescu    责编:豆豆技术应用

正在加载评论...