C 0x性能提升

前端之家收集整理的这篇文章主要介绍了C 0x性能提升前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
允许编写更高效C代码的C 0x改进之一是unique_ptr智能指针(太糟糕了,它不会允许移动通过memmove()像操作:提案没有进入草稿).

即将到来的标准还有哪些其他性能改进?以下列代码为例:

  1. vector<char *> v(10,"astring");
  2. string concat = accumulate(v.begin(),v.end(),string(""));

代码将连接矢量v中包含的所有字符串.这个整洁的代码的问题是accumulate()复制的东西,不使用引用.而每当加号操作符被调用时,string()会重新分配.因此,代码与良好优化的模拟C代码相比性能较差.

C 0x提供了解决问题的工具吗?

解决方法

是C通过称为移动语义的东西解决问题.

基本上,如果该对象是临时的,它允许一个对象承担另一个对象的内部表示.例如,您可以通过复制构造函数来复制字符串中的每个字节,通常只允许目标字符串承担源字符串的内部表示.只有当源是r值时才允许这样做.

这是通过引入移动构造函数来完成的.它是一个构造函数,您知道src对象是一个临时的,并且正在消失.因此,目的地可以接受src对象的内部表示.

移动分配运算符也是如此.

为了区分复制构造函数和移动构造函数,该语言引入了rvalue引用.一个类定义了它的move构造函数,以获取一个只能绑定到rvalues(临时)的r值引用.所以我的课程会定义一些如下的东西:

  1. class CMyString
  2. {
  3. private:
  4. char* rawStr;
  5. public:
  6.  
  7. // move constructor bound to rvalues
  8. CMyString(CMyString&& srcStr)
  9. {
  10. rawStr = srcStr.rawStr
  11. srcStr.rawStr = NULL;
  12. }
  13.  
  14. // move assignment operator
  15. CMyString& operator=(CMyString&& srcStr)
  16. {
  17. if(rawStr != srcStr.rawStr) // protect against self assignment
  18. {
  19. delete[] rawStr;
  20. rawStr = srcStr.rawStr
  21. srcStr.rawStr = NULL;
  22. }
  23. return *this;
  24. }
  25.  
  26. ~CMyString()
  27. {
  28. delete [] rawStr;
  29. }
  30. }

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

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