У меня вопрос очень похож на
Как выделить std :: строка в стеке с использованием строковой реализации glibc?
но думаю стоит спросить еще раз.
Я хочу std::string
с локальным хранилищем, которое переливается в бесплатное хранилище. std::basic_string
предоставляет распределитель в качестве параметра шаблона, поэтому кажется, что нужно написать распределитель с локальным хранилищем и использовать его для параметризации basic_string
, например:
std::basic_string<
char,
std::char_traits<char>,
inline_allocator<char, 10>
>
x("test");
Я попытался написать класс inline_allocator
, который работал бы так, как вы ожидаете: он резервирует 10 байтов для хранения, а если basic_string
требуется более 10 байтов, он вызывает ::operator new()
. Я не мог заставить его работать. В ходе выполнения указанной выше строки кода моя стандартная строковая библиотека GCC 4.5 вызывает конструктор копирования inline_allocator
4 раза. Мне не ясно, есть ли разумный способ написать конструктор копирования для inline_allocator
.
В другом потоке StackOverflow Эрик Мельски предоставил эту ссылку на класс в Chromium:
http://src.chromium.org/svn/trunk/src/base/stack_container.h
что интересно, но это не прямая замена для std::string
, потому что он оборачивает std::basic_string
в контейнер, так что вам нужно вызвать перегруженный operator->()
, чтобы получить std::basic_string
.
Я не могу найти других решений этой проблемы. Может быть, нет хорошего решения? И если это правда, то являются ли концепции std::basic_string
и std::allocator
сильно ошибочными? Я имею в виду, похоже, что это должен быть очень простой и простой вариант использования для std::basic_string
и std::allocator
. Я полагаю, что концепция std::allocator
предназначена в первую очередь для бассейнов, но я думаю, что она также должна охватывать и это.
Похоже, что семантика перемещения rvalue-reference в C ++ 0x может позволить записать inline_allocator
, если строковая библиотека переписана так, что basic_string
использует конструктор перемещения своего распределителя вместо конструктора копирования. Кто-нибудь знает, каковы перспективы такого исхода?
Мое приложение должно создавать миллион крошечных строк ASCII в секунду, поэтому в итоге я написал свой собственный класс строк фиксированной длины на основе Boost.Array
, который отлично работает, но меня это все еще беспокоит.