Прежде чем я напишу свой собственный, я попрошу всех вас.
Я ищу класс С++, который почти точно как вектор STL, но хранит данные в массиве в стеке. Будет работать и какой-то класс распределителя STL, но я стараюсь избегать любых кучей, даже статических распределенных кучевых потоков (хотя один из них - мой второй выбор). Стек более эффективен.
Он должен быть почти заменой текущего кода, который использует вектор.
Для чего я собирался написать себя, я думал о чем-то вроде этого:
char buffer[4096];
stack_vector<match_item> matches(buffer, sizeof(buffer));
Или класс может содержать буферное пространство внутри. Тогда это будет выглядеть так:
stack_vector<match_item, 256> matches;
Я думал, что он выбросит std:: bad_alloc, если у него закончится свободное пространство, хотя этого и не должно произойти.
Обновление
Использование Chromium stack_container.h отлично работает!
Причина, по которой я не думал, что так делаю это сам, заключается в том, что я всегда игнорировал параметр объекта allocator для конструкторов коллекции STL. Я несколько раз использовал параметр шаблона для создания статических пулов, но я никогда не видел кода или не писал никаких, которые фактически использовали параметр объекта. Я узнал что-то новое. Очень круто!
Код немного беспорядочен и по какой-то причине GCC заставил меня объявить распределитель как фактический элемент, а не конструировать его в параметр векторного распределителя. Это произошло от чего-то вроде этого:
typedef std::pair< const char *, const char * > comp_list_item;
typedef std::vector< comp_list_item > comp_list_type;
comp_list_type match_list;
match_list.reserve(32);
Для этого:
static const size_t comp_list_alloc_size = 128;
typedef std::pair< const char *, const char * > comp_list_item;
typedef StackAllocator< comp_list_item, comp_list_alloc_size > comp_list_alloc_type;
typedef std::vector< comp_list_item, comp_list_alloc_type > comp_list_type;
comp_list_alloc_type::Source match_list_buffer;
comp_list_alloc_type match_list_alloc( &match_list_buffer );
comp_list_type match_list( match_list_alloc );
match_list.reserve( comp_list_alloc_size );
И я должен повторять это, когда я объявляю новый. Но он работает так, как я хотел.
Я заметил, что у stack_container.h установлен StackVector, и я попытался его использовать. Но он не наследует от вектора или не определяет одни и те же методы, поэтому он не был заменой. Я не хотел переписывать весь код с помощью вектора, поэтому я отказался от него.