以下片段的效果之间有什么区别:
cout << "Some text" << s1 << "some more text\n";
cout << "Some text" + s1 + "some more text\n";
答案 0 :(得分:15)
operator + on strings的结果是一个新字符串。因此,在示例中
cout << "Some text" + s1 + "some more text\n";
在将整个内容写入cout之前,会创建两个新字符串(意味着内存分配)。在你的第一个例子中,所有内容都直接写入cout而没有不必要的内存分配。
答案 1 :(得分:5)
请考虑以下事项:
cout << "Some text" + " " + "some more text\n";
它不会做你的想法。运算符+并不总是意味着连接。
编辑:当应用于原始字符串时,operator +不会连接 - 它会添加指向字符串的指针的地址。结果几乎可以保证是无意义的,因为它指向与任何原始字符串无关的内存区域。幸运的是,它会使你的程序崩溃。
编辑2:显然,自从我犯了这个错误以来已经很长时间了。结果是如此荒谬,以至于编译器拒绝编译它。
答案 2 :(得分:2)
是的,string operator+ (const char* lhs, const string& rhs)
创建并返回一个未命名的临时字符串对象。
cout << "Some text"
调用ostream&amp; ostream :: operator&lt;&lt;(const char * const)并返回ostream引用。
cout << "Some text" << s1 << "some more text\n";
是ostream::operator<<( "Some text").operator<<(s1).operator<<("some more text\n")
,三次调用cout,调用两个不同的op&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;需要const* char* const
和op&lt;&lt;需要const string&
。没有内存分配,唯一的复制是cout的缓冲区。
cout << "Some text" + s1 + "some more text\n";
是临时字符串对象上的ostream::operator<<(t1)
我将调用 t1 ,其中t1是来自::operator+ ( "Some text", s1).operator+("some more text\n")
的临时结果。 (注意第一个运算符+不是字符串的成员,而是命名空间范围内的op +(const char * const,const string&amp;)。它返回一个字符串,所以第二个+“是string :: operator +(const char * const) )。)
因此,在此代码中创建(然后销毁)两个临时字符串对象。这意味着字符串的两个内部表示(因此两个内存分配)和两个副本两个新分配的内存(除了复制到cout的缓冲区)。
答案 3 :(得分:1)
第二个连接字符串然后将它们发送到cout,这是一个性能命中,对于大字符串可能非常大。如果可以的话,你总是想要使用第一个表格。