如何管理 mpz_t 的数组

How do I manage an array of mpz_t

我正在使用 GMP,我需要 mpz_t 的数组。 sizeof(mpz_t) 给出 16,但我存储的数字比这大得多。 mpz_t 是否增长 "in place",我。 e.我是否需要分配更多内存并允许就地增长,或者 GMP 是否在其他地方为它们分配 space 并只保留引用(在这种情况下,我假设,我不必采取任何特别注意事项。)

是的,你可以声明一个mpz_t的数组。 GMP info pages:

中明确提到
mpz_t vec[20];

如果您查看头文件,mpz_t 持有一个指向 "limbs" 数组的指针 (_mp_d),该数组通过通常的方式动态分配和调整大小。

至于古怪,当然是:

typedef __mpz_struct mpz_t[1];

在 GMP 5.1.3 中,mpz_t__mpz_struct 的单元素数组,因此声明元素可以照常进行。但是,只有一个指针被传递给函数调用。实际上是个好把戏。

声明一个数组来存储多个 mpz_t 值是安全的。根据the GNU MP manual:

mpz_t is actually implemented as a one-element array of a certain structure type. This is why using it to declare a variable gives an object with the fields GMP needs, but then using it as a parameter passes a pointer to the object. Note that the actual contents of an mpz_t are for internal use only and you should not access them directly if you want your code to be compatible with future GMP releases.

可以这样想:如果您声明单个 mtz_t 变量,则该变量的 space 由编译器在编译时静态分配。在 运行 时间内,变量的大小怎么可能会发生变化?它不能,这意味着在数组中使用它是完全没问题的。

GNU MP 3.11 manual 开始,以下几行是相关的。

GMP variables are small, containing only a couple of sizes, and pointers to allocated data. Once you have initialized a GMP variable, you don't need to worry about space allocation. All functions in GMP automatically allocate additional space when a variable does not already have enough. They do not, however, reduce the space when a smaller value is stored.

所以,我想这回答了你的问题。