C ++-STL-向量-为什么没有工具在向量中指示relocation_count

时间:2018-08-06 10:37:01

标签: c++ vector stl

令人惊讶的是,鉴于预期保留向量的大小有助于提高应用程序的性能,并且 确保填充后不会发生昂贵的重定位 为何没有提供获得relocation_count的便利 在任何给定时间,这可能非常有助于程序员跟踪最佳状态 在实际容量可能会分配给向量的大小 需要根据观察期间的平均值确定,因为 确切的数字可能不会预先知道。

1 个答案:

答案 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

Live Demo on coliru

此示例是概念证明,因为它没有考虑std::vector::emplace()std::vector::resize()等。

顺便说一句。如果直接调用std::vector::push_back(),则会绕过计数(并可能“忽略”重新分配)。

使用自定义分配器可以解决此限制。