У меня есть вопрос, очень похожий на
Как мне выделить std :: string в стеке, используя реализацию строки glibc?
, но я думаю, что это стоитснова спрашиваю.
Я хочу std::string
с локальным хранилищем, которое переполняется в бесплатное хранилище.std::basic_string
предоставляет распределитель в качестве параметра шаблона, поэтому кажется, что нужно написать распределитель с локальным хранилищем и использовать его для параметризации basic_string
, например:
std::basic_string<
char,
std::char_traits<char>,
inline_allocator<char, 10>
>
x("test");
Iпопытался написать класс 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
, который работаетхорошо, но это все еще беспокоит меня.