在mpz_t(MPIR)中分配多少空间?

时间:2015-01-13 00:19:27

标签: c++ c mpir

假设我知道我的号码可能有多少位数(并且我想第一次分配适当的空间量,我如何计算我需要分配的字节数?我想我可以总是将值设置为1*10^(num digits),然后设置为0,但感觉不对,就像我打败目的一样。

为了清楚起见编辑:我想知道我需要多少字节来存储一个带有n十进制数字的整数,以及MPIRs实现是否会影响它。 @JonathonLeffler在评论中给出了正确答案。

1 个答案:

答案 0 :(得分:3)

由于存在MPIR标记,这可能是MPIR,GMP的一个分支。在当前文档(仅限PDF - 无在线HTML)中,在“初始化整数”标题下,您可以找到:

  

void mpz_init2(mpz_t integer, mp_bitcnt_t n)

     

初​​始化   integer,有空间   n位,并将其值设置为0。   n   只是最初的空间,   integer   如有必要,将以正常方式自动增长   用于存储的后续值。   mpz_init2   如果a,可以避免这种重新分配   最大尺寸是事先知道的。

如果是GMP,您可以阅读Initializing integers上的在线手册,找到:

  

- 功能:void mpz_init2(mpz_t x, mp_bitcnt_t n)

     

初始化x,空格为n - 位数,并将其值设置为0.永远不需要调用此函数而不是mpz_initmpz_inits;需要时,GMP会自动处理重新分配。

     

虽然n定义了初始空间,但如果需要,x会以正常方式自动增长,以便存储后续值。如果事先知道最大大小,mpz_init2可以避免这种重新分配。

     

在准备手术时,GMP通常会分配比最终需要更多的肢体。要确保GMP不会对x执行重新分配,您需要将mp_limb_t中的位数添加到n

两者基本相同。