首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LLVM SmallVector的STL/Boost等价物?

LLVM SmallVector的STL/Boost等价物?
EN

Stack Overflow用户
提问于 2013-08-30 18:18:50
回答 4查看 5.7K关注 0票数 20

我一直在尝试,当有许多小的数据向量时,我是否可以优化情况。在我的用例中,可能存在这些向量的100,000+,因此向量存储的大小至关重要。每个元素有时可能只有1到2个元素,但在许多情况下可能会增长更大的容量。

我尝试过使用一个简单的std::vector,但它的速度非常慢,因为它在堆上分配了N个小缓冲区,这会浪费内存,并且在时间要求严格的环境中占用的时间太长。实际上,向量上的小缓冲区优化(SBO)看起来是一个可行的解决方案。这意味着将使用向量的内部(即堆栈)数据,直到超出它,然后才需要使用堆。

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-31 02:49:51

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

票数 4
EN

Stack Overflow用户

发布于 2013-09-26 20:20:02

我在boost中为它创建了一个票据作为功能请求:票据#9165 (https://svn.boost.org/trac/boost/ticket/9165)

票数 4
EN

Stack Overflow用户

发布于 2013-08-30 18:26:15

可以使用某种类型的适配器/代理类来实现,这些适配器/代理类封装了一个普通的std::vector,并且可能使用std::array进行普通的“小向量”操作。在翻译索引时,只需使用与std::vector相同的接口就足够了。最大的问题是迭代器,但这可能可以通过封装封装的集合的迭代器来克服。

不过,要将它们整合在一起需要做大量的工作,所以可能更简单的是使用一个带有预分配内存的封装的std::vector。然后在push_back等函数中检查添加的项是否在预先分配的内存中,并且只将该项设置在正确的位置,而不是调用向量push_back

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18530512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档