编译时常量与运行时常量

Compile-time vs runtime constants

本文关键字:常量 运行时 编译      更新时间:2023-10-16

我目前正在开发自己的数学库,以提高我的c++技能。我绊倒了boost的常量头文件,我问自己使用编译时常量超过运行时声明常量的意义是什么?

const float root_two = 1.414213562373095048801688724209698078e+00;
const float root_two = std::sqrt( 2.0f );

当使用固定的编译时常数而在运行带有函数的应用程序时进行计算时,是否会引入错误?如果您使用运行时常量,那么错误不会被忽略吗?

  1. 正如HansPassant所说,它可能为您节省一微瓦。但是,请注意,编译器有时会通过在编译期间计算表达式并替换文字值来优化它。

  2. 使用固定的编译时常数时不会引入错误吗?如果您使用的是任意精度数据类型,则可能。但是使用像double这样的普通数据类型更有效,而且这些数据类型的精度被限制在16位左右。

  3. 基于(2),您的第二次初始化不会比第一次更精确。事实上,如果您使用任意精度计算器预先计算了平方根的值,那么文字甚至可能精确。

像Boost这样的库必须在多种环境中工作。使用该库的应用程序可以将FPU设置为从刷新到零模式,为非规范化(微小)结果提供0.0。

或者应用程序可以使用-fast-math标志编译,给出不准确的结果。

此外,(a + b + c)的运行时计算取决于编译器生成的代码如何存储中间结果。它可以选择将(a + b)从FPU中弹出为64位双精度,或者它可以将它作为80位留在FPU堆栈中。它取决于很多东西,也取决于结合律的代数重写。

总而言之,如果你混合使用不同的处理器、操作系统、编译器和不同的应用程序,你将会得到不同的结果。

在某些(罕见)情况下,这是不需要的;您可能需要一个精确的常量值。