Comments 11
std::string не подходит для игровых движков и разработки игр из-за необходимости управления динамической памятью
Если не изменяет память, в std::string есть небольшой буфер и в случае коротких строк может хранить данные в самом объекте не выделяя память в куче.
Буфер врядли, может какие то экзотические реализации, может быть sso. Любой мало мальский буфер это доп расходы памяти, и в общем случае это будет неприемлимо для софта, строка может не хранить данные, но место занимать будет
Да во всех основных есть буфер в самой структуре для мелких строк.
Ну это как раз SSO оптимизация, которая не влияет на общий размер размер структуры. Но по замерам на паре проектов, процент таких коротких строк составлял меньше пяти. А самая частая длина составляла от 20 до 92 символов. Надо отметить, что за последние 15 лет средняя длина строки выросла раза в полтора, еще в 2009 я проводил похожие измерения и было 12 - 60, правда не на игровых проектах, а промышленном софте
Извините конечно, но библиотеку работы с памятью, устойчивой к фрагментации, я видел лет так 20 назад. Точнее, доки к ней.
Кратко: при выделении небольших блоков памяти, они выделяются как часть ранее выделенной странице. Т.е. страница, хранящая блоки до 8 байт длиной, до 16 байт, до 32, до 64, до 128 и так далее. И этот подход отлично работает.
Неужели эта проблема до сих пор актуальна хотя где-то?
Мистер строка!
Стандартная библиотека C++ поддерживает гибкий и богатый класс для работы со строками. К сожалению,
std::string
не подходит для игровых движков и разработки игр из-за необходимости управления динамической памятью.
Если автора беспокоит нагрузка на память, мелкие и частые аллокации. Удобно использовать полиморфные аллокаторы из С++ 17.
Маленький спойлер. Я для своего движка Arcanum, используя С++ 98, перетащил минимальную возможную реализацию полиморфных аллокаторов, оно совместимо по коду с С++ 17, но и так же собирается на старых компиляторах от С++ 98 до последнего. Немножко безумно, но почему нет:)
А зачем вообще аллоцировать много раз? Аллоцировал разок буфер (большой массив char) с запасом и пиши в конец. Пусть буфер хранит первый свободный символ. А вместо строк использовать индекс в этом массиве, с которого начинается эта строка. Тут только есть сложность если хочется очищать буфер не полностью. Но если строки нужны не более игрового такта, то всё очень просто - сбрасываешь свободный символ в начала цикла на ноль и пиши заново.
Строки в игровых движках