C++0x performance improvements
Yes C++ solves the problem through something called move semantics.
Basically it allows for one object to take on the internal representation of another object if that object is a temporary. Instead of copying every byte in the string via a copy-constructor, for example, you can often just allow the destination string to take on the internal representation of the source string. This is allowed only when the source is an r-value.
This is done through the introduction of a move constructor. Its a constructor where you know that the src object is a temporary and is going away. Therefore it is acceptable for the destination to take on the internal representation of the src object.
The same is true for move assignment operators.
To distinguish a copy constructor from a move constructor, the language has introduced rvalue references. A class defines its move constructor to take an rvalue reference which will only be bound to rvalues (temporaries). So my class would define something along the lines of:
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 is a very good and detailed article on move semantics and the syntax that allows you to do this.
One performance-boost will be generalized constant expressions,which is introduced by the keyword constexpr.
constexpr int returnSomething() {return 40;}
int avalue[returnSomething() + 2];
This is not legal C++ code, because returnSomething()+2 is not a constant expression.
But by using the constexpr keyword, C++0x can tell the compiler that the expression is a compile-time constant.