请考虑以下代码.
#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的下一个版本中.