如何管理 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.
所以,我想这回答了你的问题。
我正在使用 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 anmpz_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.
所以,我想这回答了你的问题。