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