【问题标题】:Memory assigned to c code is much less than it is supposed to use分配给 c 代码的内存比它应该使用的要少得多
【发布时间】:2015-05-31 21:27:58
【问题描述】:

我是这个论坛的新手...

我正在编写一个 DSMC C 代码,它应该使用 500MB 的 RAM 空间,因为我已经计算了 sizeof(double)==8sizeof(int)==4。 然而,当我运行代码时,我的 windows8.1 的任务管理器只显示 code.exe 文件正在使用 172 MB 的内存。为什么会发生这种情况...? 我正在使用 10-15 个非常长的多维数组,例如 ..var_name[3][4050000]。 这让我很担心,因为我需要的结果也不如预期..

所有的变量都定义在main()之外,并且被定义为静态...

#define MNC 202500
#define MNM 4050000
#define MNSC 16020000
...

static double PP[3][MNM],PV[3][MNM],CG[6][MNC],CT[MNC],CSS[9],CS[7][MNC],FDPCELL[MNC],FDPCELL1[4][4];
static int IR[MNM],ISCG[2][MNSC],IPL[MNM],ISC[MNSC],IC[2][MNC],DPCELL[MNC],DPCELL1[4][4],n;
static double NCOLM,NROW,NSLC,BMEJ;
static double TIME,FTMP,VFX,VFY,VFZ,VMP,TMPJ,FVJ,SELT,X,Y,Z;
...

int main()
{
    ...
    return 0;
}

如果你们中的任何人建议我这样一个不可预测的错误可能有什么问题,那就太好了......

【问题讨论】:

  • 很多事情都可以在那里发挥作用。没有看到你的代码,很难评论。
  • 您是如何准确测量 172MB 的?物理内存页面很可能在首次访问时按需分配,因此进程可能不会分配全部 500MB,除非它全部使用。
  • 欢迎来到 SO。请阅读How to Ask。请出示代码。
  • 你会初始化每个数组的每一个数组元素吗?
  • 任务管理器有多个可用的内存列。我相信默认的显示工作集,即 Windows 选择分配给物理 RAM 的分配内存的一部分。剩余的内存可能还没有初始化,或者可能因为最近没有被使用而被换出。

标签: c++ c windows memory multidimensional-array


【解决方案1】:

嗯,这可能是您的代码中的一些问题,而且您确实分配的比您想象的要少。此外,任务管理器显示的是操作系统目前正在“处理”的内容。由于各种原因,操作系统可能尚未分配内存。尝试使用所有内存,看看任务管理器显示的数量是否发生变化。

要真正确定编译器分配了多少内存,请生成一个 MAP 文件并找到符号 (var_name) 并查看确切分配了多少。

【讨论】:

    【解决方案2】:

    各种事情都可能导致这种行为:

    • 如果这些数组的某些区域从未被访问过,则相应的内存页面永远不会分配到物理内存中;
    • 您的程序可能不会同时使用所有数组,并且在任何时候都可能只需要每个数组的一小部分;在这种情况下,您的大部分阵列都会被换出物理内存,从而显着减少其使用量。

    没有看到代码,这些是最可能的原因。

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2011-05-09
      • 2023-03-13
      • 2016-12-02
      • 2020-01-28
      相关资源
      最近更新 更多