GNU MP:无法分配内存(大小=4294959136)
GNU MP: Cannot allocate memory (size=4294959136)
GMP 似乎无法分配大于此数量的内存,尽管它是在 64 位中编译的。我有一个简单的程序,您可以对其进行测试,而 运行 它似乎最多只使用 1500mb 内存,仅此而已。这应该能够计算出即使是 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 64 位,20h2,GCC
这种情况是在 Windows 上使用主要面向 UNIX 的库的典型情况:YMMV。
果然,快速检查显示 long
数据类型 (example). It's unsurprising that it doesn't work on Win32, where long
is 32-bit. Win32 uses the LLP64 model, and MinGW follows that (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)
所以它在某个地方溢出 and/or(可能是另一个 long
变量)。 Report it to the libgmp
project. For more exposure can also report to MSYS2.
GMP 似乎无法分配大于此数量的内存,尽管它是在 64 位中编译的。我有一个简单的程序,您可以对其进行测试,而 运行 它似乎最多只使用 1500mb 内存,仅此而已。这应该能够计算出即使是 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 64 位,20h2,GCC
这种情况是在 Windows 上使用主要面向 UNIX 的库的典型情况:YMMV。
果然,快速检查显示 long
数据类型 (example). It's unsurprising that it doesn't work on Win32, where long
is 32-bit. Win32 uses the LLP64 model, and MinGW follows that (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)
所以它在某个地方溢出 and/or(可能是另一个 long
变量)。 Report it to the libgmp
project. For more exposure can also report to MSYS2.