允许编写更高效C代码的C 0x改进之一是unique_ptr智能指针(太糟糕了,它不会允许移动通过memmove()像操作:提案没有进入草稿).
@H_502_2@即将到来的标准还有哪些其他性能改进?以下列代码为例:
vector<char *> v(10,"astring"); string concat = accumulate(v.begin(),v.end(),string(""));@H_502_2@代码将连接矢量v中包含的所有字符串.这个整洁的代码的问题是accumulate()复制的东西,不使用引用.而每当加号操作符被调用时,string()会重新分配.因此,代码与良好优化的模拟C代码相比性能较差. @H_502_2@C 0x提供了解决问题的工具吗?
解决方法
是C通过称为移动语义的东西解决问题.
@H_502_2@基本上,如果该对象是临时的,它允许一个对象承担另一个对象的内部表示.例如,您可以通过复制构造函数来复制字符串中的每个字节,通常只允许目标字符串承担源字符串的内部表示.只有当源是r值时才允许这样做.
@H_502_2@这是通过引入移动构造函数来完成的.它是一个构造函数,您知道src对象是一个临时的,并且正在消失.因此,目的地可以接受src对象的内部表示.
@H_502_2@移动分配运算符也是如此.
@H_502_2@为了区分复制构造函数和移动构造函数,该语言引入了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; } }@H_502_2@Here是关于移动语义和语法的非常好的和详细的文章,可以让你这样做.