C 0x性能提升

前端之家收集整理的这篇文章主要介绍了C 0x性能提升前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
允许编写更高效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;
     }
 }

Here是关于移动语义和语法的非常好的和详细的文章,可以让你这样做.

猜你在找的C&C++相关文章