C 如何管理mpz_t阵列

C 如何管理mpz_t阵列,c,gmp,C,Gmp,我正在使用GMP,我需要一个mpz\u t数组sizeof(mpz_t)给出16,但我存储的数字远大于16。mpz\u t是否“就地”增长,即。E我是否需要分配更多内存并允许就地增长,还是GMP在其他地方为它们分配空间并只保留引用(在这种情况下,我假设,我不需要采取任何特别的预防措施。)是的,您可以声明一个mpz_t数组。在以下文件中明确提到: 如果查看头文件,mpz\u t会保存一个指向“肢体”数组的指针(\u mp\u d),该数组通过常用方法动态分配和调整大小 至于怪诞,当然: typed

我正在使用GMP,我需要一个
mpz\u t
数组
sizeof(mpz_t)
给出16,但我存储的数字远大于16。
mpz\u t
是否“就地”增长,即。E我是否需要分配更多内存并允许就地增长,还是GMP在其他地方为它们分配空间并只保留引用(在这种情况下,我假设,我不需要采取任何特别的预防措施。)

是的,您可以声明一个
mpz_t
数组。在以下文件中明确提到:

如果查看头文件,
mpz\u t
会保存一个指向“肢体”数组的指针(
\u mp\u d
),该数组通过常用方法动态分配和调整大小

至于怪诞,当然:

typedef __mpz_struct mpz_t[1];

在GMP 5.1.3中,
mpz_t
是一个
\uuu mpz_结构
的单元素数组,因此声明一个元素可以正常工作。但是,只有一个指针被传递给函数调用。实际上,这是一个很好的技巧。

声明一个数组来存储大量的
mpz\t
值是安全的。根据:

mpz_t
实际上是作为特定结构类型的一个元素数组实现的。这就是为什么使用它来声明一个变量会给一个对象提供GMP需要的字段,但是使用它作为参数会传递一个指向该对象的指针。请注意,
mpz\u t
的实际内容仅供内部使用,如果希望代码与将来的GMP版本兼容,则不应直接访问这些内容


可以这样想:如果您声明一个
mtz_t
变量,那么该变量的空间在编译时由编译器静态分配。变量的大小在运行时如何变化?它不能,这意味着在数组中使用它是非常好的。

下面几行中的内容是相关的

GMP变量很小,只包含几个大小,并且指向分配数据的指针。一旦初始化了GMP变量,就不需要担心空间分配。当变量没有足够的空间时,GMP中的所有函数都会自动分配额外的空间。但是,当存储较小的值时,它们不会减少空间

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

typedef __mpz_struct mpz_t[1];