允许编写更高效C代码的C 0x改进之一是unique_ptr智能指针(太糟糕了,它不会允许移动通过memmove()像操作:提案没有进入草稿).
vector<char *> v(10,"astring"); string concat = accumulate(v.begin(),v.end(),string(""));
代码将连接矢量v中包含的所有字符串.这个整洁的代码的问题是accumulate()复制的东西,不使用引用.而每当加号操作符被调用时,string()会重新分配.因此,代码与良好优化的模拟C代码相比性能较差.
C 0x提供了解决问题的工具吗?
解决方法
是C通过称为移动语义的东西解决问题.
基本上,如果该对象是临时的,它允许一个对象承担另一个对象的内部表示.例如,您可以通过复制构造函数来复制字符串中的每个字节,通常只允许目标字符串承担源字符串的内部表示.只有当源是r值时才允许这样做.
这是通过引入移动构造函数来完成的.它是一个构造函数,您知道src对象是一个临时的,并且正在消失.因此,目的地可以接受src对象的内部表示.
移动分配运算符也是如此.
为了区分复制构造函数和移动构造函数,该语言引入了rvalue引用.一个类定义了它的move构造函数,以获取一个只能绑定到rvalues(临时)的r值引用.所以我的课程会定义一些如下的东西:
class CMyString { private: char* rawStr; public: // move constructor bound to rvalues CMyString(CMyString&& srcStr) { rawStr = srcStr.rawStr srcStr.rawStr = NULL; } // move assignment operator CMyString& operator=(CMyString&& srcStr) { if(rawStr != srcStr.rawStr) // protect against self assignment { delete[] rawStr; rawStr = srcStr.rawStr srcStr.rawStr = NULL; } return *this; } ~CMyString() { delete [] rawStr; } }