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)
这是关于移动语义和允许您执行此操作的语法的非常好的详细文章.
一个性能提升将是通用常量表达式,由关键字constexpr引入.
constexpr int returnSomething() {return 40;}
int avalue[returnSomething() + 2];
Run Code Online (Sandbox Code Playgroud)
这不是合法的C++代码,因为returnSomething()+ 2不是常量表达式.
但是通过使用constexpr关键字,C++ 0x可以告诉编译器表达式是编译时常量.