在我写我自己的之前,我会问你们所有人。
我正在寻找一个几乎完全像 STL 向量但将数据存储到堆栈上的数组中的 C++ 类。某种 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 效果很好!
我自己没想过这样做的原因是我一直忽略了 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,我尝试使用它。但它没有从 vector 继承或定义相同的方法,因此它不是一个直接替代品。我不想使用向量重写所有代码,所以我放弃了它。