Использует ли оператор std::stringstream << strcat?
Я только что узнал об алгоритме "Schlemiel the Painter" ( http://en.wikipedia.org/wiki/Joel_Spolsky) и понял, что могу быть Шлемелем.
В моем коде я много конкатенации строк с std::stringstream
"s operator<<
, Я был смущен, узнав, что интенсивное использование конкатенации c-стиля с strcat
имеет довольно большую неэффективность.
С ++ std::stringstream
"s operator<<
использования strcat
? Или он использует более эффективный метод?
1 ответ
ostringstream
поддерживается stringbuf
, который наследует от streambuf
; при записи в ostringstream
вы пишете в контролируемую выходную последовательность streambuf
, Согласно 27.6.2:
2 - Каждая последовательность характеризуется тремя указателями [...]
- начальный указатель или самый низкий адрес элемента в массиве [...]
- следующий указатель или следующий адрес элемента, который является текущим кандидатом на чтение или запись [...]
- указатель конца или адрес первого элемента за концом массива [...]
Так что ostringstream
эффективно имеет постоянный доступ к текущему концу своей выходной последовательности.
Обратите внимание, что с помощью strlen
в любом случае выходная последовательность не будет работать, так как строки C++ могут содержать встроенные нулевые символы.
Также обратите внимание, что прямая конкатенация строк (string::operator+=(const string &)
), вероятно, будет более эффективным, чем ostream
операторы, так как нет необходимости проходить через виртуальные методы.