在我写自己之前,我会问你们所有人.
我正在寻找一个几乎完全像STL向量的C++类,但是将数据存储到堆栈中的数组中.某种类型的STL分配器类也可以工作,但我试图避免任何类型的堆,甚至是静态分配的每线程堆(尽管其中一个是我的第二选择).堆栈效率更高.
它需要几乎替代使用向量的当前代码.
对于我自己要写的东西,我在考虑这样的事情:
char buffer[4096]; stack_vectormatches(buffer, sizeof(buffer));
或者类可以在内部分配缓冲区空间.然后它看起来像:
stack_vectormatches;
我认为如果空间不足,它会抛出std :: bad_alloc,尽管这不应该发生.
更新
使用Chromium的stack_container.h效果很好!
我之所以没想过这样做的原因是我总是忽略了STL集合构造函数的allocator对象参数.我已经使用了几次模板参数来做静态池,但是我从未见过代码或编写任何实际使用过对象参数的代码.我学到了新东西.很酷!
代码有点乱,由于某种原因,GCC强迫我将分配器声明为实际项而不是将其构造为vector的allocator参数.它来自这样的事情:
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继承或定义相同的方法,因此它不是替代品.我不想使用向量重写所有代码,所以我放弃了它.
您不必编写全新的容器类.您可以坚持使用STL容器,但更改第二个参数,例如std::vector
为其提供从堆栈缓冲区分配的自定义分配器.铬作者为此写了一个分配器:
https://chromium.googlesource.com/chromium/chromium/+/master/base/stack_container.h
它的工作原理是分配一个缓冲区,你可以说它有多大.您创建容器并调用container.reserve(buffer_size);
.如果溢出该大小,分配器将自动从堆中获取元素(因为它是派生的std::allocator
,在这种情况下它将只使用标准分配器的工具).我没有尝试过,但看起来它来自谷歌,所以我觉得值得一试.
用法是这样的:
StackVectors; s->push_back(42); // overloaded operator-> s->push_back(43); // to get the real std::vector. StackVector ::ContainerType & v = s.container(); std::cout << v[0] << " " << v[1] << std::endl;
看来boost :: static_vector就是你要搜索的.从文档:
static_vector是vector和array之间的混合:就像vector一样,它是一个具有连续存储的序列容器,可以改变大小,以及静态分配,低开销和固定容量的数组.static_vector基于Adam Wulkiewicz和Andrew Hundt的高性能varray类.
static_vector中的元素数量可以动态变化到固定容量,因为元素与数组类似地存储在对象本身内.
您可能想要查看的一些选项:
Matthew Wilson(Imperfect C++的作者)的STLSoft有一个auto_buffer
模板类,它将一个默认数组放在堆栈上,但是如果它增长到大于堆栈分配将从堆中获取内存.我喜欢这个类 - 如果你知道你的容器大小通常会受到一个相当低的限制,那么你就可以获得一个本地堆栈分配数组的速度.但是,对于需要更多内存的极端情况,它仍能正常工作.
http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html
请注意,我自己使用的实现不是STLSoft,而是一个从中大量借用的实现.
"Lazy Programmer"发布了一个alloca()
用于存储的容器实现的帖子.我不是这种技术的粉丝,但我会让你自己决定它是否是你想要的:
http://tlzprgmr.wordpress.com/2008/04/02/c-how-to-create-variable-length-arrays-on-the-stack/
再有就是boost::array
它有没有前两个的动态调整大小的行为,但给你更多的vector
接口比只用指针作为您使用内置阵列获得迭代器(即,你得到的.begin()
,end()
,size()
等):
http://www.boost.org/doc/libs/1_37_0/doc/html/boost/array.html