ПРИМЕЧАНИЕ. Этот ответ получил некоторое внимание в последнее время. Я не выступаю за это как решение (это решение, которое я видел в прошлом, перед STL). Это интересный подход и должен применяться только к std::string
или std::stringstream
, если после профилирования вашего кода вы обнаружите, что это улучшает.
Обычно я использую либо std::string
или std::stringstream
. У меня никогда не было проблем с этим.
Я видел, как другие люди делают свой собственный оптимизированный построитель строк в далеком прошлом.
class StringBuilder {
private:
std::string main;
std::string scratch;
const std::string::size_type ScratchSize = 1024; // or some other arbitrary number
public:
StringBuilder & append(const std::string & str) {
scratch.append(str);
if (scratch.size() > ScratchSize) {
main.append(scratch);
scratch.resize(0);
}
return *this;
}
const std::string & str() {
if (scratch.size() > 0) {
main.append(scratch);
scratch.resize(0);
}
return main;
}
};
Он использует две строки, одну для большей части строки, а другую как область скреста для конкатенации коротких строк. Добавляет оптимизацию, добавляя короткие операции добавления в одну маленькую строку, а затем добавляя ее к основной строке, тем самым уменьшая количество перераспределений, необходимых для основной строки, по мере ее увеличения.
Я не требую этого трюка с std::string
или std::stringstream
. Я думаю, что он использовался с третьей строковой библиотекой перед std :: string, это было так давно. Если вы сначала примете стратегию, как этот профиль, ваше приложение.