Использует ли оператор 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 операторы, так как нет необходимости проходить через виртуальные методы.

Другие вопросы по тегам