У меня вопрос, очень похожий на
Как выделить std::string в стеке с помощью реализации строки 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 в С++ 0x может сделать запись inline_allocator
, если строковая библиотека переписана так, что basic_string
использует конструктор перемещения своего распределителя вместо копировать конструктор. Кто-нибудь знает, что перспектива для этого результата?
Моему приложению нужно построить миллион крошечных строк ASCII в секунду, поэтому я написал свой собственный строковый класс с фиксированной длиной, основанный на Boost.Array
, который отлично работает, но это все равно беспокоит меня.