如何解决GNU MP:无法分配内存大小=4294959136
尽管以 64 位编译,GMP 似乎无法分配大于此数量的内存。我有一个简单的程序,您可以对其进行测试,并且在运行它时似乎只使用了 1500 mb 的内存,仅此而已。这应该能够计算偶数 32 位应用程序的数字,但是由于它是 64 位,因此无法计算数字似乎很奇怪。这是一个遇到此问题的简单程序
#include "gmp.h"
int main()
{
unsigned int n = 500000000;
mpz_t output;
mpz_init(output);
mpz_fac_ui(output,n);
mpz_clear(output);
return 0;
}
GMP 6.2.1 从 MSYS2、Windows 10 64bit、20h2、GCC 安装
解决方法
这种情况是在 Windows 上使用主要面向 UNIX 的库的典型情况:YMMV。
果然,快速检查发现 long
数据类型 (example) 的广泛使用。毫不奇怪,它在 Win32 上不起作用,其中 long
是 32 位。 Win32 使用 LLP64 模型,MinGW 遵循该模型 (source)。
即使是打印 GNU MP: Cannot allocate memory
的 error reporting code 也是有问题的:
fprintf (stderr,"GNU MP: Cannot allocate memory (size=%lu)\n",(long) size);
它实际上是将 64 位 size_t
打印为 32 位 long
。所以您看不到实际的 size
值。
如果我们解决这个问题:
fprintf (stderr,"GNU MP: Cannot allocate memory (size=%zu)\n",size);
现在打印出它试图 size
的真实 malloc
:
GNU MP: Cannot allocate memory (size=18446744073709250080)
所以它在某处溢出和/或环绕(可能是另一个 long
变量)。 Report 到 libgmp
项目。如需更多曝光也可向MSYS2举报。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。