Недавно я хотел сделать это сам и обнаружил следующий код:
Chronium's stack_container.h
Он определяет новый std::allocator
, который может обеспечить выделение на основе стека для начального выделения памяти для контейнеров STL. Я нашел другой способ решения своей конкретной проблемы, поэтому я сам не использовал код, но, возможно, он будет вам полезен. Обязательно прочтите комментарии в коде, касающиеся использования и предостережений.
Тем, кто усомнился в целесообразности и здравомыслии, подумайте:
- Часто вы априори знаете, что ваша строка имеет разумный максимальный размер. Например, если в строке будет храниться 32-разрядное целое число в десятичном формате, вы знаете, что для этого нужно не более 11 символов. В этом случае не требуется строка, которая может динамически увеличиваться до неограниченного размера.
- Во многих случаях выделение из стека происходит быстрее, чем выделение из кучи.
- Если строка часто создается и уничтожается (предположим, это локальная переменная в часто используемой служебной функции), выделение из стека вместо кучи позволит избежать оттока фрагментов в распределителе кучи. Для приложений, которые используют много памяти, это может изменить правила игры.
Некоторые люди отмечают, что строка, использующая распределение на основе стека, не будет std::string
, как будто это каким-то образом уменьшает ее полезность. Правда, вы не можете использовать их взаимозаменяемо, поэтому вы не сможете передать свои stackstring
функциям, ожидающим std::string
. Но (если вы все сделаете правильно), вы сможете использовать все те же функции-члены на stackstring
, которые вы используете сейчас на std::string
, например find_first_of()
, append()
и т. Д. begin()
и end()
все равно будет работать нормально, поэтому вы сможете использовать многие алгоритмы STL. Конечно, это не будет std::string
в самом строгом смысле этого слова, но в практическом смысле оно все равно будет «строкой», и все равно будет весьма полезным.