c - Windows 中的内存分配限制 + 我是否正确计算?

标签 c windows memory-management limit

我正在编写一个需要大量内存的程序(大图分析)。

目前我的程序中主要有两个数据结构(占用了大部分内存)。它们是:

  • int **
  • 类型的 n*n 矩阵
  • 和长度为 n 的数组,类型为 Node *

在这种情况下,节点是一个包含两个整数的结构 (sizeof(Node) = 8)

我可以运行我的代码的 n 的最大值是 22900,做一些计算我得到:

22900*22900 * sizeof(int) * 8 + 22900 * sizeof(Node) = 16782591360 位

这是 1.95375077 GB。

那么问题 1:我是否正确计算了这两个数据结构的内存使用量? 和 2:Windows 上是否有 2GB 的内存分配限制。如果是这样,我该如何解决?

有关更多信息,我在一台使用 GCC 编译的 64 位 Windows 7 机器上,运行时有 4GB RAM 和 ~3GB 空闲 RAM。

谢谢。

最佳答案

您没有正确计算它。首先,没有理由将任何东西乘以 8。C 中的分配量是字节,而不是位。其次,您忽略了实现矩阵第一维的指针数组。所以:

22900 * sizeof(int*) + 22900*22900*sizeof(int) + 22900*sizeof(Node) = 2097914800 bytes

至于有用的建议,我会留给(已经发布的)其他答案。

关于c - Windows 中的内存分配限制 + 我是否正确计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6683843/

相关文章:

c++ - 有条件的 Windows 管理员提示

objective-c - 在 init 中引发异常时如何防止泄漏?

c - 在 C 中的输入系统调用期间添加的额外字符串

c - 优化一个简单的 pinball 求解器

c - QTCreator 调用层级

python - CUDA 问题 - 如何在 Win 10 中清理安装 CUDA 以解决 cudaGetDevice() 失败

c++ - C/C++ (Linux) 中的信号量访问模式

c# - 如何判断提供的文件是否确实是注册表配置单元

"int array[int]"和 "int *array"之间的混淆

java - 是否可以让 GC 管理 native 对象的生命周期?