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