7

任何从源代码构建过 gcc 的人都知道,gmp 是 gcc 的依赖项。为什么是这样?换句话说,gcc 实际上是用来做什么的?

4

1 回答 1

9

请参阅此对类似(但不相同)问题的答案。

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

甚至 C 也更喜欢使用 bigint 进行常量折叠:它是获得表达式正确结果的唯一方法(可能是在一些宏扩展之后获得的,即使您没有在源代码中显式放置它),例如(123456789087651234*65125412651209128612+187451)%10000000141or (140000000000041*150000000000061+134500000000139)%250000000000111

我忘记了 C 或 C++ 标准对此类常量表达式的规定。正确计算它们当然没有错。但是 Fortran 要求它们被正确计算,这需要 bigints。我的第二个示例仅包含适合 64 位的素数,但您需要 bignums 才能正确计算结果......

此外,GCC 在交叉编译时需要更精确的主机整数。考虑一下从 32 位到 64 位机器的明显交叉编译,您当然希望常量折叠来计算所有 64 位!

此外,一些巧妙的优化(特别是GCC 使用的Cloog 或 PPL多面体优化)可能需要在一次优化过程中和内部使用 bigint 算法来精确。更一般地说,优化是符号处理,而符号处理通常需要bignums。在这种优化过程中,即使源代码只有很小的常数,也可能会出现很大的数字。

于 2013-04-05T05:35:42.083 回答