簡體   English   中英

GNU MP:無法分配 memory(大小=4294959136)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM