为什么gcc需要gmp?

为什么gcc需要gmp?,gcc,gmp,Gcc,Gmp,任何从源代码构建过gcc的人都知道,gmp是gcc的依赖项。为什么会这样?换句话说,gcc实际使用它的目的是什么?请看一个类似(但不相同)的问题 编译器内部(编译时)需要GMP,特别是对于常量折叠。一些语言标准(特别是Fortran的一些最新版本)要求以任意精度计算,例如1234567891234567*1234567891 对于常量折叠,即使是C也更喜欢使用bigint:这是获得表达式正确结果的唯一方法(可能是在一些宏扩展之后获得的,即使您没有在源代码中显式地将其放入),如(123456789

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

请看一个类似(但不相同)的问题

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

对于常量折叠,即使是C也更喜欢使用bigint:这是获得表达式正确结果的唯一方法(可能是在一些宏扩展之后获得的,即使您没有在源代码中显式地将其放入),如
(12345678908751234*65125412651209128612+187451)%1000000141
(14000000000041*1500000000061+13450000000139)%25000000000111

<>我忘记了C或C++标准对这些常量表达式的计算。正确地计算它们当然不是错误的。但是FORTRAN要求它们正确计算,而且需要重写。我的第二个例子只包含64位的素数,但是需要正确的计算结果……/P> 当交叉编译需要更精确的主机整数时,考虑到从32到64位机器的交叉编译,当然需要常数折叠来计算所有64位!


此外,还有一些巧妙的优化(特别是GCC使用的优化)在一次优化过程中和内部,可能需要精确的bigint算法。更一般地说,优化是符号处理,符号处理通常需要。在这种优化过程中,即使源代码只有非常小的常数,也可能出现相当大的数。

啊,好的。常数折叠参数感觉。我不知道Fortran有任意精度的整数。Fortran本机没有bignums,但标准要求常数折叠以任意精度完成。