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

时间:2015-04-19 08:04:56

标签: c++ boost stl

请考虑以下代码。

#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)

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

容量= 10

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

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

1 个答案:

答案 0 :(得分:10)

这是一个明显的错误。罪魁祸首是this diff,它改变了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;

用作"optimization",可能是通过避免分支。

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

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

所以,不是添加extra_capacity(在你的情况下是10),而是减去它。

此错误已在Boost.Container的主干中修复,修复程序应该在Boost的下一个版本中。