【问题标题】:No change in RAM usage when running c++ program运行 c++ 程序时 RAM 使用没有变化
【发布时间】:2015-10-30 09:05:05
【问题描述】:

我编写了一个简单的程序,试图查看内存的变化,但没有。无论我是否运行代码,总是会出现大约 20% 的水平直线。

#include<iostream>
using namespace std;
int main()
{
       int *m;
       int i;
       cin>>i;
       m = new int[i];
}

是否应该为 i 的任何值分配内存?并显示免费内存的变化?

【问题讨论】:

  • 你如何衡量内存的变化?而且您知道,一旦您的程序退出,它分配的任何内存都会自动释放?
  • 是的,我知道这一点。我写了一个 while(1) 无限循环来检查是否曾经分配过内存,但效果相同。使用系统监视器以及 top 命令我正在测量内存的变化。
  • 那么...您为i 输入了什么值?当你说你有 20% 的基线时,那是什么的 20%?您是否尝试过用一些数据填充分配的内存,因为除非您开始写入,否则您的虚拟内存系统可能不需要实际分配空间来分配空间?
  • 我尝试了从大到大的 i 值。我没有用任何值填充我的数组,因为 new 无论如何都会分配内存。
  • Mos 操作系统在读取或写入内存之前不会实际分配内存。如果将数组中的所有值设置为零,您可能会看到内存使用量增加。

标签: c++ memory-management ram


【解决方案1】:

可能会发生很多事情......

  • 编译器编译器可能正在优化内存分配(因为它实际上没有做任何事情)
  • 操作系统内存可能没有被操作系统分配,因为页面没有被写入
  • 采样资源使用情况可能不会显示在系统监视器上,因为您的程序在分配内存后立即退出

因此,为了消除这些潜在原因,您可以编写如下内容...

#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 字节。

【讨论】:

  • 这取决于请求的大小。如果它足够小,它通常会从现有堆中分配,它可能包含也可能不包含已分配内存的页面。如果足够大,堆请求通常会直接向操作系统请求内存(mmapsbrk 等...),在这种情况下,通常会延迟分配页面的内存。确保页面被分配(和常驻)的另一种方法是mlockmadvise
【解决方案2】:

发生这种情况的原因可能有很多:

  1. 编译器优化 - 如果您打开编译器优化,它可能会确定您的 m 指针从未被使用过,因此它会简单地删除 new[] 运算符调用;
  2. 操作系统优化 - 堆分配是操作系统内存管理器的业务。它只能在第一次使用内存时分配内存。例如,Windows API HeapAlloc 方法的行为就是这样;
  3. 您的工具限制 - 内存分配/释放可能太快而无法捕获(基于您的示例);
  4. 内存分配失败 - 如果你的i 值太大,堆管理器有可能找不到这样大小的连续内存块,所以new 操作符会引发bad_alloc异常,您的程序将被终止。

【讨论】:

    【解决方案3】:

    您为 int 的最大大小分配了内存。那是4个字节。现在假设您的 RAM 有 8 GB。 4 个字节大约是 8 GB RAM 的 0.00000005%。

    【讨论】:

    • 不,他正在分配一个整数数组。
    猜你喜欢
    • 2012-10-06
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多