编译时常量与运行时常量
Compile-time vs runtime constants
我目前正在开发自己的数学库,以提高我的c++技能。我绊倒了boost的常量头文件,我问自己使用编译时常量超过运行时声明常量的意义是什么?
const float root_two = 1.414213562373095048801688724209698078e+00;
const float root_two = std::sqrt( 2.0f );
当使用固定的编译时常数而在运行带有函数的应用程序时进行计算时,是否会引入错误?如果您使用运行时常量,那么错误不会被忽略吗?
-
正如HansPassant所说,它可能为您节省一微瓦。但是,请注意,编译器有时会通过在编译期间计算表达式并替换文字值来优化它。
-
使用固定的编译时常数时不会引入错误吗?如果您使用的是任意精度数据类型,则可能。但是使用像
double
这样的普通数据类型更有效,而且这些数据类型的精度被限制在16位左右。 -
基于(2),您的第二次初始化不会比第一次更精确。事实上,如果您使用任意精度计算器预先计算了平方根的值,那么文字甚至可能更精确。
像Boost这样的库必须在多种环境中工作。使用该库的应用程序可以将FPU设置为从刷新到零模式,为非规范化(微小)结果提供0.0。
或者应用程序可以使用-fast-math标志编译,给出不准确的结果。
此外,(a + b + c)的运行时计算取决于编译器生成的代码如何存储中间结果。它可以选择将(a + b)从FPU中弹出为64位双精度,或者它可以将它作为80位留在FPU堆栈中。它取决于很多东西,也取决于结合律的代数重写。
总而言之,如果你混合使用不同的处理器、操作系统、编译器和不同的应用程序,你将会得到不同的结果。
在某些(罕见)情况下,这是不需要的;您可能需要一个精确的常量值。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在声明中合并两个常量"std::set"(不是在运行时)
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- 使用运行时常量实例化的函数模板
- 常量操作是否在运行时计算
- 如何在模板中定义浮点常量.避免在运行时强制转换
- C++ 运行时计算的常量变量
- 如何在运行时在通过 Cython 导入的 c++ 头文件中设置常量
- 用于定义数组大小的运行时常量
- 在运行时定义的C++全局外部常量可用于多个源文件
- 编译-vs运行时常量变量赋值和C++中vlas的分配
- 编译时常量与运行时常量
- 扩展std::chrono功能以处理运行时(非编译时)常量周期
- 在编译时或运行时将常量字符 * 映射到鸭型 T