令人惊讶的是,鉴于预期保留向量的大小有助于提高应用程序的性能,并且 确保填充后不会发生昂贵的重定位 为何没有提供获得relocation_count的便利 在任何给定时间,这可能非常有助于程序员跟踪最佳状态 在实际容量可能会分配给向量的大小 需要根据观察期间的平均值确定,因为 确切的数字可能不会预先知道。
答案 0 :(得分:1)
要计算std::vector
的重新分配,可以将std::vector
(或至少它的写访问方法)包装到帮助器类中。
示例代码:
#include <iostream>
#include <vector>
template <typename VALUE>
struct AllocCounter {
std::vector<VALUE> &vec;
unsigned n;
AllocCounter(std::vector<VALUE> &vec): vec(vec), n(0) { }
void push_back(const VALUE &value)
{
size_t old = vec.capacity();
vec.push_back(value);
n += old != vec.capacity();
}
};
int main()
{
std::vector<int> values;
AllocCounter<int> countAllocs(values);
for (int i = 1; i <= 1024; ++i) {
unsigned nOld = countAllocs.n;
countAllocs.push_back(i);
if (countAllocs.n > nOld) std::cout << 'R';
std::cout << '.';
}
std::cout << '\n'
<< "Number of (re-)allocations: " << countAllocs.n << '\n';
// done
return 0;
}
输出:
R.R.R..R....R........R................R................................R................................................................R................................................................................................................................R................................................................................................................................................................................................................................................................R................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Number of (re-)allocations: 11
此示例是概念证明,因为它没有考虑std::vector::emplace()
,std::vector::resize()
等。
顺便说一句。如果直接调用std::vector::push_back()
,则会绕过计数(并可能“忽略”重新分配)。
使用自定义分配器可以解决此限制。