STL/Boost相当于LLVM SmallVector?

Cro*_*rog 18 c++ boost stl vector llvm

我一直试图看看我是否可以在拥有许多小数据向量时优化案例.在我的用例中,可能有100,000多个这样的向量,因此向量存储的大小是至关重要的.每个可能有时只有1或2个元素,但在许多情况下可能会增大容量.

我已经尝试过使用一个简单的std :: vector但这非常慢,因为它在堆上分配N个小缓冲区会浪费内存并且在时间关键的环境中需要太长时间.有效地,矢量上的小缓冲区优化(SBO)看起来似乎是一个可行的解决方案.这意味着使用向量的内部(即堆栈)数据直到超过它,然后才需要使用堆.

我偶然发现了LLVM SmallVector,它似乎就是这样做的.然而,它似乎在LLVM框架中有很多依赖项,并且想知道Boost中是否存在类似的东西?可能有可能通过Boost实现执行SBO优化,但我在搜索中找不到对此的任何引用.我已经看到STL实现在技术上被禁止形成这种优化虽然由于一些关于迭代器的规则但是?

链接:LLVM SmallVector位于LLVM软件的内部源代码中.

man*_*lio 17

Boost v1.58(2015年4月)的Container库有实验容器:small_vector

small_vector是一个类似矢量的容器,针对包含很少元素的情况进行了优化.它包含一些就地预分配的元素,这允许它在实际元素数低于预分配阈值时避免使用动态存储分配.small_vector灵感来自LLVM的SmallVector容器.static_vector与之不同,small_vector的容量可以超出最初的预分配容量.

small_vector<T, N, Allocator>可转换为small_vector_base<T, Allocator>一种独立于预分配元素计数的类型,允许客户端代码不需要在该N参数上进行模板化.small_vector继承了所有vector的成员函数,因此它支持所有标准功能,如安置,有状态分配器等.


您可能还对Electronic Arts Standard Template Library中的一些容器感兴趣.

在Github上有一个存储库(看看固定大小的容器eastl::vector_*,它们类似于LLVM的SmallVector).


有了Qt,那就是QVarLengthArray全班.

  • 现在还有来自 Google 的 [abseil inlined_vector](https://github.com/abseil/abseil-cpp/blob/master/absl/container/inlined_vector.h)。此外,来自 Facebook 的 [folly small_vector](https://github.com/facebook/folly/blob/master/folly/docs/small_vector.md) 已经被提及但值得重复。 (2认同)

Ant*_*kov 4

首先,你肯定可以提取 LLVM 的 SmallVector,它具有相当少量的依赖项和自由的许可证。据我所知,STL/Boost 没有与 SmallVector 直接等效的东西。Folly 中有一个小的向量类(https://github.com/facebook/folly