std :: string SSO tuning

Можно ли как-то настроить std::string Small / Short String Optimization ?

Например, если мне приходится работать с большим количеством коротких строк, но длиннее 15 символов (например, имя lastname + ", " + firstname + ", " + middlename длина которого обычно находится в диапазоне [20; 40] ).

Upd:

Похоже, что ответ отрицательный. Но когда я открыл файл basic_string.h я нашел это:

 template class basic_string { ... enum { _S_local_capacity = 15 / sizeof(_CharT) }; union { _CharT _M_local_buf[_S_local_capacity + 1]; size_type _M_allocated_capacity; ... }; 

Итак, теперь непонятно, почему _S_local_capacity жестко запрограммирован таким образом …

Вся идея с «оптимизацией коротких строк» ​​заключается в том, что она «не занимает лишнее пространство. Поэтому размер вычисляется таким образом, что локальный буфер накладывает другие переменные в classе, которые используются, когда строка больше.

Плохая идея изменить системные заголовки, поскольку они часто зависят от версии компилятора, и есть детали реализации, которые делают его «двоичным несовместимым».

Как говорится в комментарии, убедитесь, что это действительно проблема (производительность или иное), прежде чем что-либо сделать. И затем тщательно подумайте, что вы должны с этим поделать. Какую проблему вы пытаетесь исправить, и уверены ли вы, что это того стоит. Помните, что если вы делаете что-то вроде:

  std::string func(std::string arg) { ... } 

вы скопируете больше байтов при передаче arg в стек. И нет, это не помогает сделать его const std::string& arg если ваш код вызова создает временную строку, например func("Name: " + name); , И если вы делаете vector , размер каждого будет больше, поэтому вектор займет больше места – даже в тех случаях, когда строка STILL не подходит, поэтому больше времени будет сделано при росте / сжимаем вектор.

И я думаю, что правильное решение, как только вы приняли решение, – это реализовать свой собственный class строк. std::string является стандартным classом библиотеки шаблонов, они не расширяемы, и вы не должны изменять стандартные файлы заголовков библиотеки, поскольку, как я уже сказал ранее, он сильно зависит от компилятора. Будет совсем некоторая работа, чтобы сделать его полностью совместимым с std::string , но вы могли бы, конечно, «обмануть» и сделать operator std::string() функции преобразователя operator std::string() для вашего строкового classа, так что вам нужно только создать больше базовые функции, которые предлагает std::string .