C++ Can';t测量由std::vector引起的内存分配<>;::Windows下的预订

C++ Can';t测量由std::vector引起的内存分配<>;::Windows下的预订,c++,windows,memory-management,vector,allocation,C++,Windows,Memory Management,Vector,Allocation,考虑以下代码段: void OutputMemoryStatus() { PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo(::GetCurrentProcess(), &pmc, sizeof(pmc)); std::cout << pmc.WorkingSetSize / (1024.0 * 1024.0) << std::endl; } int main() { std::vec

考虑以下代码段:

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();
  }

这样看来,尽管保留了400 MB的内存,这是通过调用Load()来确认的,但是Windows并不认为这个内存是被分配的,但是当我们实际上用1个$1000的值填充向量时,内存(4MB)被认为是分配的。 怎么解释呢

我使用的是Visual Studio 2015,版本配置,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();
int大小;
标准:cin>>尺寸;
std::vec;
OutputMemoryStatus();
向量储备金(10万美元);
OutputMemoryStatus();

std::cout工作集是在任何给定时间实际存在于物理RAM中的内存,并且随着内存页被分页进出而变化。内存,特别是大的分配,可以从被分页开始。使用它们会将它们分页,但在这个过程中可能会将其他内容分页

PageFileSize可能是一个更好的衡量进程内存量的指标


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

工作集是在任何给定时间实际存在于物理RAM中的内存,并随着内存页被分页进出而改变。内存,特别是大的分配,可以从被分页开始。使用它们会将它们分页,但在这个过程中可能会将其他内容分页

PageFileSize可能是一个更好的衡量进程内存量的指标


另外,不确定Windows是否会这样做,但过度使用内存是一件事,如果机器上的所有进程同时需要太多内存,可能会导致操作系统杀死您的程序或其他程序是什么?他们在for循环后调用它。@KerrekSB用另一个调用更新了这个问题。@Decraded:谢谢-现在这是一个真正的问题:-)真正的答案是现代操作系统非常聪明、懒惰。您打印的是工作集大小(正在使用的内存),而不是提交(分配的内存)@KerrekSB这不是
OutputMemoryStatus()的意思吗是什么?他们在for循环后调用它。@KerrekSB用另一个调用更新了这个问题。@Decraded:谢谢-现在这是一个真正的问题:-)真正的答案是现代操作系统非常聪明、懒惰。您打印的是工作集大小(正在使用的内存),而不是提交(分配的内存)。
  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();