我知道几个(全部?)STL实现实现了一个“小字符串”优化,其中,如果sizeof(),则代替将通常的3个指针存储在开始,结束和容量中,字符串将实际的字符数据存储在用于指针的内存中。字符)<= sizeof(pointers)。我处在很多小向量的情况下,这些向量的元素大小<= sizeof(pointer)。我不能使用固定大小的数组,因为向量需要能够动态调整大小,并且可能会变得很大。但是,向量的中值(不是均值)大小仅为4-12字节。因此,适应矢量的“小字符串”优化对我来说将非常有用。这样的事情存在吗?
我正在考虑通过简单的蛮力将向量转换为字符串来滚动自己,即为字符串提供向量接口。好主意?
您可以从LLVM借用SmallVector实现。 (仅标头,位于LLVM \ include \ llvm \ ADT中)
Boost 1.58刚刚发布,并且它的Container
库具有基于LLVM small_vector的SmallVector
类。
还有一个static_vector
,它不能超过初始给定的大小。这两个容器都是仅标头。
facebook的folly库也有一些很棒的容器。
它具有一个small_vector
,可以使用模板参数对其进行配置,使其类似于boost的small_vector
或static
向量。它也可以配置为内部整数簿记使用小整数类型,考虑到它们是facebook,这并不奇怪:)
正在进行使库跨平台的工作,因此Windows / MSVC支持应该有一天出现...
如果T是POD类型,为什么不使用basic_string而不是vector ??
它是在small
年前的(而且该线程中的一些名称可能看起来有点熟悉:-)),但是我不知道现有的实现。我认为我不会尝试使discussed适应任务。对于std::string
的类型的确切要求尚不明确,但该标准非常清楚,它仅适用于表现与std::basic_string
类似的事物。对于完全不同的类型,它可能仍然可以工作,但是很难说会发生什么-它从来没有打算这样做,并且可能没有经过除小整数以外的许多类型的测试。
char
的完全符合要求的实现需要大量工作。但是,从头开始实现std::vector
的可用子集(即使包括小的向量优化)通常也不会非常困难。如果您包括一个小的向量优化,我可以肯定地说您不能满足std::vector
上的所有要求。
特别是,在已将实际数据存储在矢量对象中的地方交换或移动矢量意味着您将需要交换/移动实际数据项,其中std::vector
的要求取决于其仅存储指向以下内容的指针数据,因此通常只需操作指针就可以1交换或移动内容,而无需实际触摸数据项本身。因此,即使操作数据项本身会/将要抛出,也必须能够在不抛出的情况下执行这些操作。因此,小的向量优化将无法满足这些要求。
另一方面,如上所述,对std::vector
的要求之一是,它只能存储可以进行操作而不会抛出的项目。因此,如果std::string
完全是一个可行的选择,则实现自己的std::string
类容器也可能无需太多担心这些细节。
vector
中,最终也必须交换/移动实际的数据项:如果两个向量使用不同的分配器,则必须通过该向量的目标为目标中的对象分配空间。分配器。