运行 c++ 程序时 RAM 使用没有变化
No change in RAM usage when running c++ program
我写了一个简单的程序试图查看内存中的变化,但是有 none。无论我是否 运行 代码,总是会出现大约 20% 左右的水平直线。
#include<iostream>
using namespace std;
int main()
{
int *m;
int i;
cin>>i;
m = new int[i];
}
是否应该为 i 的任何值分配内存?并显示内存中的变化?
您为 int 的最大大小分配了内存。那是4个字节。现在假设您的 RAM 有 8 GB。 4 个字节大约是 8 GB RAM 的 0.00000005%。
发生这种情况的原因可能有很多:
- 编译器优化 - 如果您打开编译器优化,它可能会确定您的
m
指针从未被使用,因此它会简单地删除 new[]
接线员呼叫;
- 操作系统优化 - 堆分配是 OS 内存管理器业务。它只能在第一次内存使用时分配内存。例如 Windows API
HeapAlloc
方法就是这样;
- 您的工具限制 - 内存 allocation/deallocation 可能太快而无法捕捉(基于您的示例);
- 内存分配失败 - 如果你的
i
值太大,堆管理器可能无法找到这样大小的连续内存块,所以 new
运算符将引发 bad_alloc
异常并且您的程序将被终止。
可能会发生很多事情...
- 编译器 编译器可能正在优化内存分配(因为实际上什么也没做)
- 操作系统操作系统可能未分配内存,因为页面未写入
- 采样资源使用情况可能不会显示在您的系统监视器上,因为您的程序在分配内存后立即退出
因此,要消除这些潜在原因,您可以编写如下内容...
#include <iostream>
int main(int argc, char* argv[]) {
int x,y;
std::cin >> x;
int* m = new int[x];
for (int i = 0; i < x; i++)
m[i] = i;
std::cin >> y;
std::cout << m[y] << std::endl;
return 0;
}
然后,您应该能够在输入 y
值之前检查内存使用情况。我不确定您使用的是什么操作系统,但您应该会看到图像大小和程序的驻留内存大致增加 4x
字节。
我写了一个简单的程序试图查看内存中的变化,但是有 none。无论我是否 运行 代码,总是会出现大约 20% 左右的水平直线。
#include<iostream>
using namespace std;
int main()
{
int *m;
int i;
cin>>i;
m = new int[i];
}
是否应该为 i 的任何值分配内存?并显示内存中的变化?
您为 int 的最大大小分配了内存。那是4个字节。现在假设您的 RAM 有 8 GB。 4 个字节大约是 8 GB RAM 的 0.00000005%。
发生这种情况的原因可能有很多:
- 编译器优化 - 如果您打开编译器优化,它可能会确定您的
m
指针从未被使用,因此它会简单地删除new[]
接线员呼叫; - 操作系统优化 - 堆分配是 OS 内存管理器业务。它只能在第一次内存使用时分配内存。例如 Windows API
HeapAlloc
方法就是这样; - 您的工具限制 - 内存 allocation/deallocation 可能太快而无法捕捉(基于您的示例);
- 内存分配失败 - 如果你的
i
值太大,堆管理器可能无法找到这样大小的连续内存块,所以new
运算符将引发bad_alloc
异常并且您的程序将被终止。
可能会发生很多事情...
- 编译器 编译器可能正在优化内存分配(因为实际上什么也没做)
- 操作系统操作系统可能未分配内存,因为页面未写入
- 采样资源使用情况可能不会显示在您的系统监视器上,因为您的程序在分配内存后立即退出
因此,要消除这些潜在原因,您可以编写如下内容...
#include <iostream>
int main(int argc, char* argv[]) {
int x,y;
std::cin >> x;
int* m = new int[x];
for (int i = 0; i < x; i++)
m[i] = i;
std::cin >> y;
std::cout << m[y] << std::endl;
return 0;
}
然后,您应该能够在输入 y
值之前检查内存使用情况。我不确定您使用的是什么操作系统,但您应该会看到图像大小和程序的驻留内存大致增加 4x
字节。