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 memoryerror 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.