Есть ли разница между + -ing строками и << -ing строками в c ++? - PullRequest
2 голосов
/ 08 апреля 2009

Какая разница, если есть, между эффектами следующих фрагментов:

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

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

Ответы [ 4 ]

15 голосов
/ 08 апреля 2009

Результатом оператора + для строк является новая строка. Поэтому в примере

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

создаются две новые строки (подразумевается распределение памяти), прежде чем все это записывается в cout В вашем первом примере все записывается напрямую в cout без ненужного выделения памяти.

5 голосов
/ 08 апреля 2009

Рассмотрим следующее:

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

Это не будет делать то, что вы думаете. Оператор + не всегда означает сцепление.

Редактировать: При применении к необработанным строкам оператор + не объединяет - он добавляет адреса указателей в строки. Результат почти гарантированно будет бессмысленным, поскольку он указывает на область памяти, которая не имеет отношения к какой-либо из исходных строк. Если повезет, это приведет к краху вашей программы.

Редактировать 2: Видимо, прошло очень много времени с тех пор, как я совершил эту ошибку. Результаты настолько бессмысленны, что компилятор отказывается их компилировать.

2 голосов
/ 08 апреля 2009

Да, string operator+ (const char* lhs, const string& rhs) создает и возвращает неназванный временный строковый объект.

cout << "Some text" вызывает ostream & ostream :: operator << (const char * const) и возвращает ссылку ostream. </p>

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

равно ostream::operator<<( "Some text").operator<<(s1).operator<<("some more text\n"), три вызова cout, вызывающие две разные перегрузки op <<, op <<, который принимает <code>const* char* const, и op <<, который принимает <code>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 &) в области имен. Он возвращает строку, поэтому второй + "это string :: operator + (const char * const) .)

Таким образом, два временных строковых объекта создаются (и затем уничтожаются) в этом коде. Это означает два внутренних представления для строк (таким образом, два выделения памяти) и две копии двух, которые недавно распределили память (в дополнение к копированию в буфер cout).

1 голос
/ 08 апреля 2009

Вторая объединяет строки перед отправкой их в cout, что является ударом по производительности, потенциально довольно большим с большими строками. Вы всегда хотите использовать первую форму, если можете.

...