【问题标题】:Analyze memory usage of a C program分析 C 程序的内存使用情况
【发布时间】:2013-05-30 21:14:48
【问题描述】:

我知道有很多类似的问题(我不确定是否可能重复),但我的问题足够具体。我在 Windows 和 Unix 中运行 C 程序,并且遇到分段错误(核心转储)错误。我知道那个错误的来源。这是因为我有时会通过分配一个大整数数组来使用大量内存。我的数组的大小每次都不同但我不能(主要是我不想) 使用内存的动态分配。

我想要的是找到一种方法或工具来分析我的 C 程序的内存使用情况,以便对该数组的大小或我进行的任何其他大内存分配设置一个限制。更具体地说,让我们说该数组的大小在 4*(2^4) 字节和 4*(2^50) 字节之间。最小值只有 64 个字节,但最大值是一个巨大的值。我怎样才能知道我的内存有多少程序需求以及设置的适当限制是什么? 我这样定义一个数组:

int bigarray[rows][columns],

其中行介于 2^4 和 2^50 之间,列介于 4 和 50 之间。

【问题讨论】:

  • 所以您使用的是 VLA,对吗?然后只需检查sizeof(array) > KNOWN_LIMIT_THAT_OVERFLOWS_THE_STACK
  • 2^50 为 PB。祝你好运!
  • @RichieHindle 我会将限制设置为小于 2^50,也许是 2^10
  • 2^50 甚至超过 MAX int(32 位),[] 甚至可以处理吗?
  • printf("%d\n", sizeof(bigarray));如上所述。至于 hwat 可能是适当/有用的限制,取决于平台(Windows、Linux 等)。此外,您还可以使用 malloc/new 方法从程序中压缩更多大小。

标签: c arrays memory memory-management memory-leaks


【解决方案1】:

从堆中获取内存(malloc() 和朋友)而不是使用堆栈。堆允许更大的分配。

int *bigarray = malloc(sizeof(int)*rows*columns);

/* to access row r, column c */
bigarray[r*columns+c] = 42;
/* equivalent method to access row r, column c */
*(bigarray+r*columns+c) = 42;

【讨论】:

  • 从堆中分配会使得更大的分配成为可能?
【解决方案2】:

您好,您可以使用工具valgrind 来检查内存消耗和内存泄漏。

下面是Massif: a heap profiler的链接,希望对你有帮助。

http://valgrind.org/docs/manual/ms-manual.html

【讨论】:

  • 如果我要使用像 valgrind 这样的工具,我更喜欢使用在 windows 上运行的工具。你有什么建议吗?
  • 对不起@Dchris 我现在还没有在 Windows 中进行C 编程。 :)
  • @Dchris 下面的链接可能会对您有所帮助。 stackoverflow.com/questions/413477/…
【解决方案3】:

计算(理论)内存消耗:

printf("%d MB", (rows*columns*sizeof(int))/1024/1024);

.

您将不得不使用 new/malloc 方法来充分利用它(绝对比您当前的堆栈方法更多),即如果您使用:

int *bigarray= new int[columns*rows];

然后以

的身份访问它
val= bigarray[ x*columns + y];  // instead of bigarray[x][y];

这样,在现代平台(Windows、Linux 等)和 32 位程序上,您可以预期大小为 500 - 1000 MB 的大小还可以

【讨论】:

  • 在 500-1000MB 大小的情况下运行速度有多快?
  • 你的意思是“它将运行多快”?跑什么?速度取决于你用它做什么(读取、计算、交叉搜索)、处理器和内存以及计算机的繁忙程度(分配给其他任务的内存量)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多