2009-04-08 80 views

回答

15

运算符+字符串的结果是一个新的字符串。因此,在这个例子中

cout << "Some text" + s1 + "some more text\n"; 

在整个事情被写入cout之前,会创建两个新字符串(意味着内存分配)。在你的第一个例子中,所有东西都直接写到cout中,没有不必要的内存分配。

1

第二符连接送他们来清点,这是一个性能问题,可能相当大串大前的字符串。如果可以的话,你总是希望使用第一种形式。

2

是的,string operator+ (const char* lhs, const string& rhs)创建并返回一个未命名的临时字符串对象。

cout << "Some text"调用的ostream &的ostream ::运算< <(为const char * const的)并返回ostream的参考。

cout << "Some text" << s1 << "some more text\n"; 

是cout上ostream::operator<<("Some text").operator<<(s1).operator<<("some more text\n"),三个电话,称运< <两个不同的重载,这需要一个const* char* const运< <和运< <,需要一个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 :: operator +(const char * const )。)

因此,在这段代码中创建了两个临时字符串对象(然后被析构),这意味着两个字符串的内部表示(所以两个内存分配)和两个拷贝两个新分配的内存(除了。复制到COUT的缓冲区)

5

考虑以下几点:

cout << "Some text" + " " + "some more text\n"; 

它不会做什么 您认为。运算符+并不总是意味着连接。

编辑:当应用于原始字符串时,operator +不会连接 - 它会将指针的地址添加到字符串中。结果几乎保证是无稽之谈,因为它指向与任何原始字符串都没有关系的内存区域。运气好的话会让你的程序崩溃。

编辑2:显然,我犯了这个错误已经很长时间了。结果非常荒谬,编译器拒绝编译它。

+0

不要co Mark马克,解释它是增加了两个指针。 – tpdi 2009-04-08 03:53:28

相关问题