无法测量由 std::vector<>::在 Windows 下保留引起的内存分配
Can't measure memory allocation caused by std::vector<>::reserve under Windows
考虑以下代码片段:
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是否会这样做,但是过度使用内存是一件事,如果机器上的所有进程同时需要太多内存,则可能导致操作系统杀死您的程序或其他程序,因为它认为合适。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有根的二进制搜索树.保留与其父级的链接
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 为多个会话保留XPtr
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 隐藏的成员变量不应在仅允许const访问的基类中突变,以便保留分配运算符
- 为什么我不能在同一分配中保留两个连续的内存区域,而不通过单个调用保留这两个区域?
- 保留动态分配的数组而不为删除而烦恼的最佳方法
- 分配给尚未调整大小但保留的向量元素,称为合法
- C++在 Obj1 的构造函数中使用新的 Obj2() 时分配以前保留的内存
- 我可以检查内存块(例如,使用 malloc 分配)是否保留在缓存中吗?
- STL矢量:当矢量容量因插入而增加时,在分配新的连续内存后,是否删除或保留旧的连续内存
- 如何分配指针数组并为cuda中的多个内核调用保留它们
- 我如何构建公共数据,同时保留默认的移动元素和分配
- 调整保留std::vector大小时的c++内存分配
- 无法测量由 std::vector<>::在 Windows 下保留引起的内存分配
- 在我准备好分配它之前,将“unique_ptr”保留为未设置:这就是我重新分配它的方式吗?