C++中不必要的内存拷贝带来的问题

C++中不必要的内存拷贝带来的问题

请看程序清单 12.4 实现的加法运算符,注意到它创建并返回一个拷贝。如果程序清单 12.9 所示的
MyString 类支持加法运算符,就可轻松地拼接字符串,如下所示:

MyString Hello("Hello ");
MyString World("World");
MyString CPP(" of C++");
MyString sayHello(Hello + World + CPP); // operator+, copy constructor
MyString sayHelloAgain ("overwrite this");
sayHelloAgain = Hello + World + CPP; // operator+, copy constructor, copy
assignment operator=

下述简单的代码让您能够使用双目加法运算符( +)轻松地将三个字符串拼接起来:

MyString operator+ (const MyString& addThis)
{
    MyString newStr;
    if (addThis.buffer != NULL)
    {
        // copy into newStr
    }
    return newStr; // return copy by value, invoke copy constructor
}

这个加法运算符( +)让您能够式轻松地拼接字符串,但也可能导致性能问题。创建 sayHello 时,
需要执行加法运算符两次,而每次都将创建一个按值返回的临时拷贝,导致执行复制构造函数。复制
构造函数执行深复制,而生成的临时拷贝在该表达式执行完毕后就不再存在。总之,该表达式导致生
成一些临时拷贝(准确地说是右值),而它们在当前语句执行完毕后就不再需要。这一直是 C++带来的
性能瓶颈,直到最近才得以解决。
C++11 解决了这个问题:编译器意识到需要创建临时拷贝时,将转而使用移动构造函数和移动赋
值运算符—如果您提供了它们。

点击这里进行学习:零声学院C/C++服务器课程