泛型编程-转移构造函数(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 责编:豆豆技术应用
正在加载评论...