boost::stable_vector 的容量成员函数不返回分配的容量

boost::stable_vector's capacity member function does not return the allocated capacity

本文关键字:容量 返回 分配 函数 成员 vector boost stable      更新时间:2023-10-16

请考虑以下代码。

#include <string>
#include <boost/container/stable_vector.hpp>
#include <iostream>
int main()
{
  boost::container::stable_vector<std::string> vec;
  vec.reserve(10);
  std::cout << "capacity = " << vec.capacity() << 'n';
}

运行它(在 g++/Linux 上)时,输出为:

容量 = 4294967286(即 2^32 - 10)

如果我将 boost::container::stable_vector 替换为上面的 std::vector,则输出为:

容量 = 10

我知道它也可能是容量 = 20,或容量 = 64 或其他什么,但这仍然是理智的行为。

容量() 返回stable_vector似乎是 (2^32 - N),N 是调用 reserve() 时请求的容量。我在文档中没有看到这样的容量定义:http://www.boost.org/doc/libs/1_56_0/doc/html/boost/container/stable_vector.html#idp33067968-bb。

这是一个

明显的错误。罪魁祸首是这个差异,它改变了这条线capacity()

return (index_size ? (index_size - ExtraPointers + extra_capacity) : index_size);

const size_type index_offset =
    (ExtraPointers + extra_capacity) & (size_type(0u) - size_type(index_size != 0));
return index_size - index_offset;

这旨在作为"优化",大概是通过避免分支。

不幸的是,这两个代码块并不等同。第二个实际上相当于

return (index_size ? (index_size - (ExtraPointers + extra_capacity)) : index_size);
//                                 ^                              ^

因此,它没有加extra_capacity(在你的例子中是 10),而是减去它。

该错误已在 Boost.Container 的后备箱中修复,修复应该在 Boost 的下一个版本中。