为什么gcc需要gmp?

7

对于从源代码构建gcc的人来说,gmp是gcc的依赖项。为什么会这样呢?换句话说,gcc实际上用它做什么?

1个回答

9

请参考这个回答,它与此问题类似但不相同。

GMP在编译器(在编译时)内部需要,特别是用于常量折叠。一些语言标准(特别是一些最近的Fortran版本)要求例如1234567891234567*1234567891以任意精度计算。

即使是C对于常量折叠也需要更大的整数:这是获得表达式的正确结果的唯一方法(可能在某些宏扩展后获得,即使您没有在源代码中显式放置它),例如(123456789087651234*65125412651209128612+187451)%10000000141(140000000000041*150000000000061+134500000000139)%250000000000111

我忘记了C或C++标准对这种常量表达式的规定。正确计算它们肯定不会错。但是Fortran要求它们被正确计算,因此需要大整数。我的第二个例子仅包含适合64位的质数,但您需要bignum才能正确计算结果...

此外,在交叉编译时,GCC需要比主机整数更精确的精度。考虑从32位到64位机器进行交叉编译,您肯定希望常量折叠计算所有64位!
此外,一些聪明的优化(特别是多面体优化,如{{link2:Cloog或PPL}},它们被GCC使用)可能需要在一次优化通过和内部中使用bigint算术来精确计算。更一般地说,优化是符号处理,符号处理通常需要bignums。在这样的优化期间,即使源代码只有相当小的常量,也可能出现相当大的数字。

啊,好的。常量折叠的论点很有道理。我不知道Fortran有任意精度整数。 - Brian Bi
Fortran本身不支持大数运算,但标准要求常量折叠时必须使用任意精度。 - Basile Starynkevitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接