以下片段的效果之间有什么区别(如果有):
cout << "Some text" << s1 << "some more text\n";
cout << "Some text" + s1 + "some more text\n";
以下片段的效果之间有什么区别(如果有):
cout << "Some text" << s1 << "some more text\n";
cout << "Some text" + s1 + "some more text\n";
operator+ 对字符串的结果是一个新字符串。因此,在示例中
cout << "Some text" + s1 + "some more text\n";
在将整个内容写入 cout 之前,会创建两个新字符串(意味着内存分配)。在您的第一个示例中,所有内容都直接写入 cout ,没有不必要的内存分配。
考虑以下:
cout << "Some text" + " " + "some more text\n";
它不会像你想的那样做。Operator+ 并不总是意味着连接。
编辑:当应用于原始字符串时, operator+ 不会连接 - 它会将指针的地址添加到字符串。结果几乎可以保证是无意义的,因为它指向的内存区域与任何原始字符串都没有关系。运气好的话,它会让你的程序崩溃。
编辑2:显然自从我犯这个错误以来已经很长时间了。结果是如此荒谬,以至于编译器拒绝编译它。
是的,string operator+ (const char* lhs, const string& rhs)
创建并返回一个未命名的临时字符串对象。
cout << "Some text"
调用 ostream& ostream::operator<<( 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<< 的两个不同重载,即采用 aconst* char* const
的 op<< 和采用 a 的 op<< 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")
. (注意第一个 operator+ 不是 string 的成员,而是命名空间范围内的 op+ (const char* const, const string&)。它返回一个字符串,所以第二个 +" 是 string::operator+( const char* const) .)
因此,在此代码中创建(然后销毁)两个临时字符串对象。这意味着字符串的两个内部表示(因此两个内存分配)和两个复制两个新分配的内存(除了复制到 cout 的缓冲区)。
第二个在将字符串发送到 cout 之前将它们连接起来,这是一个性能损失,对于大字符串可能会非常大。如果可以的话,你总是想使用第一种形式。