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

Cpp*_*oob 7 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';
}
Run Code Online (Sandbox Code Playgroud)

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

capacity = 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.

T.C*_*.C. 10

这是一个明显的错误.罪魁祸首是这个差异,改变了这一行capacity()

return (index_size ? (index_size - ExtraPointers + extra_capacity) : index_size);
Run Code Online (Sandbox Code Playgroud)

const size_type index_offset =
    (ExtraPointers + extra_capacity) & (size_type(0u) - size_type(index_size != 0));
return index_size - index_offset;
Run Code Online (Sandbox Code Playgroud)

这可能是一种"优化",大概是通过避免分支.

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

return (index_size ? (index_size - (ExtraPointers + extra_capacity)) : index_size);
//                                 ^                              ^
Run Code Online (Sandbox Code Playgroud)

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

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

  • 过早优化是邪恶的. (3认同)