任何曾经从源代码构建过gcc的人都知道,gmp是gcc的依赖。为什么是这样?换句话说,gcc实际上用它做什么?
答案 0 :(得分:7)
请参阅this answer类似(但不相同)的问题。
编译器内部需要GMP(在编译时间),特别是对于常量折叠。一些语言标准(特别是Fortran的一些最新版本)要求例如1234567891234567*1234567891
以任意精度计算。
对于常量折叠的bigint来说,即使C也更快乐:它是获得表达式的正确结果的唯一方法(可能是在一些宏扩展之后获得的,即使你没有把它放到明确地在您的源代码中),例如(123456789087651234*65125412651209128612+187451)%10000000141
或(140000000000041*150000000000061+134500000000139)%250000000000111
。
我忘记了C或C ++标准对这种常量表达式的看法。正确计算它们当然没有错。但是Fortran要求它们被正确计算,并且需要bigint。我的第二个例子只包含64位的素数,但你需要bignums来正确计算结果...
此外,交叉编译时的GCC需要更高的主机整数精度。考虑显然从32位到64位机器的交叉编译,你当然希望常量折叠来计算所有64位!
此外,一些聪明的优化(特别是polyhedral optimizations,如GCC使用的Cloog or PPL)可能需要在一次优化过程中和内部使用bigint算法。更一般地说,优化是符号处理,符号处理通常需要bignums。在这样的优化过程中,即使源代码只有非常小的常量,也可能出现相当大的数字。