C++ 0x性能改进

9 c++ optimization stl unique-ptr c++11

允许编写更高效的C++代码的C++ 0x改进之一是unique_ptr智能指针(太糟糕了,它不允许像memmove()那样移动:提案没有进入草案).

即将推出的标准中有哪些其他性能改进?以下代码为例:

vector<char *> v(10,"astring");
string concat = accumulate(v.begin(),v.end(), string(""));
Run Code Online (Sandbox Code Playgroud)

代码将连接vector v中包含的所有字符串.这段简洁代码的问题在于accumulate()复制周围的东西,并且不使用引用.并且每次调用string()时都会重新分配加上运算符.因此,与优化良好的模拟C代码相比,代码性能较差.

C++ 0x是否提供了解决问题的工具,也许还有其他工具?

Dou*_* T. 13

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

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

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

移动赋值运算符也是如此.

为了区分复制构造函数和移动构造函数,该语言引入了rvalue引用.一个类定义其移动构造函数以获取一个rvalue引用,该引用仅绑定到rvalues(temporaries).所以我的课程将按照以下方式定义:

 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;
     }
 }
Run Code Online (Sandbox Code Playgroud)

是关于移动语义和允许您执行此操作的语法的非常好的详细文章.

  • 这样可以更快地排序和旋转集合集合等排列操作.我怀疑最可能的例子是对字符串集合进行排序. (3认同)

Sil*_*rom 7

一个性能提升将是通用常量表达式,由关键字constexpr引入.

constexpr int returnSomething() {return 40;}

int avalue[returnSomething() + 2]; 
Run Code Online (Sandbox Code Playgroud)

这不是合法的C++代码,因为returnSomething()+ 2不是常量表达式.

但是通过使用constexpr关键字,C++ 0x可以告诉编译器表达式是编译时常量.