[英]GNU MP: Cannot allocate memory (size=4294959136)
盡管以 64 位編譯,GMP 似乎無法分配大於此數量的 memory。 我有一個簡單的程序,您可以對其進行測試,並且在運行時它似乎只使用了 1500mb memory ,僅此而已。 這應該能夠計算偶數 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;
}
從 MSYS2、Windows 10 64bit、20h2、GCC 安裝的 GMP 6.2.1
這種情況對於在 Windows: YMMV 上使用主要面向 UNIX 的庫是典型的。
果然,快速檢查揭示了long
數據類型的廣泛使用(示例)。 毫不奇怪,它不適用於 Win32,其中long
是 32 位。 Win32 使用 LLP64 model,MinGW 也遵循這一點( 來源)。
甚至打印GNU MP: Cannot allocate memory
的錯誤報告代碼也是錯誤的:
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);
現在打印出它試圖malloc
的真實size
:
GNU MP: Cannot allocate memory (size=18446744073709250080)
所以它在某個地方溢出和/或環繞(可能是另一個long
變量)。 將其報告給libgmp
項目。 如需更多曝光,也可向MSYS2報告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.