在我自己写之前,我会问你们所有人。
我正在寻找一个几乎完全像 STL vector 但将数据存储到堆栈上的数组中的 C++ 类。某种 STL 分配器类也可以工作,但我试图避免任何类型的堆,甚至是静态分配的每线程堆(尽管其中一个是我的第二选择)。堆栈效率更高。
它几乎需要替换当前使用 vector 的代码。
对于我自己要写的东西,我在想这样的事情:
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 强制我将分配器声明为实际项目,而不是将其构造为 vector 的分配器参数。它来自这样的东西:
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 继承或定义相同的方法,因此它不是一个直接替代品。我不想用 vector 重写所有代码,所以我放弃了。
最佳答案
您不必编写全新的容器类。您可以坚持使用您的 STL 容器,但更改例如 std::vector
的第二个参数,为它提供从堆栈缓冲区分配的自定义分配器。 Chrome 作者为此编写了一个分配器:
https://chromium.googlesource.com/chromium/chromium/+/master/base/stack_container.h
它的工作原理是在你说它有多大的地方分配一个缓冲区。您创建容器并调用 container.reserve(buffer_size);
。如果溢出该大小,分配器将自动从堆中获取元素(因为它是从 std::allocator
派生的,在这种情况下它将只使用标准分配器的功能)。我还没有尝试过,但它看起来像是来自谷歌,所以我认为值得一试。
用法是这样的:
StackVector<int, 128> s;
s->push_back(42); // overloaded operator->
s->push_back(43);
// to get the real std::vector.
StackVector<int, 128>::ContainerType & v = s.container();
std::cout << v[0] << " " << v[1] << std::endl;
关于c++ - 寻找类似 C++ STL 的 vector 类但使用堆栈存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/354442/