Прежде чем написать свое, я спрошу у всех вас.
Я ищу класс C ++, который почти в точности похож на вектор STL, но хранит данные в массиве в стеке. Какой-то класс распределителя STL также будет работать, но я стараюсь избегать любого вида кучи, даже статической, выделенной кучи для каждого потока (хотя один из них - мой второй выбор). Стек просто эффективнее.
Требуется почти полная замена текущего кода, который использует вектор.
Для того, что я собирался написать сам, я думал о чем-то вроде этого:
char buffer[4096];
stack_vector<match_item> matches(buffer, sizeof(buffer));
Или у класса может быть внутреннее выделение буферного пространства. Тогда это будет выглядеть так:
stack_vector<match_item, 256> matches;
Я думал, что он бросит std :: bad_alloc, если ему не хватит места, хотя это не должно происходить.
Обновление
Использование Chrome в 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, и я попытался его использовать. Но он не наследует от вектора и не определяет те же методы, поэтому он не был заменой. Я не хотел переписывать весь код, используя вектор, поэтому я отказался от него.