【发布时间】:2010-09-26 03:34:22
【问题描述】:
在我自己写之前,我会问你们所有人。
我正在寻找一个几乎完全像 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 继承或定义相同的方法,因此它不是一个直接替代品。我不想用向量重写所有代码,所以我放弃了。
【问题讨论】:
-
澄清一下,您想要的东西本质上是一个向量,但作为模板参数的一部分具有固定容量?
-
StackVector 有一种方法可以为您提供实际的 std::vector。只需做 StackVector
::ContainerType & v = stack_vector.container();为拿到它,为实现它。 v 那么是一个实际的 std::vector。还可以更好地使用我在回答的评论中解释的联合技巧。 -
否则,如果您经常使用该向量,您可能会遇到严重的性能问题,并且在某些平台(许多非 x86)上它甚至可能崩溃。
-
是的,我还在 Itanium 系统上构建以捕获此类错误。我已经修改了 stack_container.h 中的代码,但它并没有按原样编译。
标签: c++ data-structures stl vector