无法测量由 std::vector<>::在 Windows 下保留引起的内存分配

Can't measure memory allocation caused by std::vector<>::reserve under Windows

本文关键字:保留 分配 内存 Windows vector 测量 std lt gt      更新时间:2023-10-16

考虑以下代码片段:

void OutputMemoryStatus()
  {
  PROCESS_MEMORY_COUNTERS pmc;
  GetProcessMemoryInfo(::GetCurrentProcess(), &pmc, sizeof(pmc));
  std::cout << pmc.WorkingSetSize / (1024.0 * 1024.0) << std::endl;
  }
int main()
  {
  std::vector<int> vec;
  OutputMemoryStatus();
  vec.reserve(100'000'000);
  OutputMemoryStatus();
  std::cout << vec.capacity() << std::endl;
  for (int i = 0; i < 1'000'000; ++i)
    vec.push_back(i);
  OutputMemoryStatus();
  }

输出如下:

Memory used: 3.11328
Memory used: 3.20703
Capacity: 100000000
Memory used: 7.03516

因此,尽管实际上预留了400mb内存,这是通过调用capacity()确认的,但Windows并不认为这些内存是已分配的,但是当我们实际用1' 000,000 '000的值填充向量时,内存(4MB)被认为是已分配的。

怎么解释呢?

我使用的是Visual Studio 2015, Release configuration, x86平台。

现在编译器不知道实际使用的内存量,但如果我输入size = 1'000'000,结果与之前相同。

  int size;
  std::cin >> size;
  std::vector<int> vec;
  OutputMemoryStatus();
  vec.reserve(100'000'000);
  OutputMemoryStatus();
  std::cout << "Capacity: " << vec.capacity() << std::endl;
  for (int i = 0; i < size; ++i)
    vec.push_back(i);
  OutputMemoryStatus();

工作集是在任何给定时间实际在物理RAM中的内存,并且随着内存页在&出去了。内存,尤其是大的内存分配,一开始可能会被调出。使用它们会将它们分页进去,但可能会在这个过程中将其他东西分页出去。

PageFileSize可能是一个更好的衡量提交给进程的内存量的方法。

另外,不确定Windows是否会这样做,但是过度使用内存是一件事,如果机器上的所有进程同时需要太多内存,则可能导致操作系统杀死您的程序或其他程序,因为它认为合适。

相关文章: