加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C 0x性能提升

发布时间:2020-12-16 04:59:41 所属栏目:百科 来源:网络整理
导读:允许编写更高效C代码的C 0x改进之一是unique_ptr智能指针(太糟糕了,它不会允许移动通过memmove()像操作:提案没有进入草稿). 即将到来的标准还有哪些其他性能改进?以下列代码为例: vectorchar * v(10,"astring");string concat = accumulate(v.begin(),v.e
允许编写更高效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是关于移动语义和语法的非常好的和详细的文章,可以让你这样做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读