C++ 运行时计算的常量变量
C++ Const Variables calculated during run time?
在下面的代码中,常量变量 B、C 和 P 是在应用程序启动期间计算一次,还是在运行时(即每次调用抛物线正弦时)计算一次?
优化这一点,想知道如果我预先计算 B、C 和 P(以避免除法)是否会有任何不同。
谢谢。
const double B = 4.0/(float)pi;
const double C = -4.0/((float)pi*(float)pi);
const double P = 0.225;
inline double parabolicSine(double x, bool bHighPrecision = true)
{
double y = B * x + C * x * fabs(x);
if(bHighPrecision)
y = P * (y * fabs(y) - y) + y;
return y;
}
const
变量不需要在编译时计算,即使它们的定义允许这样做。虽然大多数编译器可能会在这种微不足道的情况下实现它,但要求这样做的唯一方法是使变量成为constexpr
。 constexpr
将常量表达式的定义推广到变量和函数。此外,它使您不必担心编译器的怪癖,而是明确表示变量值应在编译时可用。
是的,它们被计算一次(编译时),这是从 GCC 的反汇编:
LFE1:
.section .rdata,"dr"
.align 4
__ZL2pi:
.long 1078523331
.align 8
__ZL1B:
.long -1887771331
.long 1072980437
.align 8
__ZL1C:
.long 256041101
.long -1076234516
.align 8
__ZL1P:
.long -858993459
.long 1070386380
.align 8
另请注意,在这种情况下,优化根本不重要。 但是,在调用函数时,它可能只是作为常量推送到堆栈上(如果使用一次左右,则取决于编译器)
它们可能不会在编译时计算,但计算次数不会超过一次。(一个变量只初始化一次。因此,他们不可能在每次致电ParabolicSine
时进行评估。
它的编译器。请考虑以下示例。
int n=5;
int arr[n];// It works fine when compiling with gcc However ERROR : when compiling in Visual Studio.
const int n=5;
int arr[n]; //Compiles successfully in VS
相关文章:
- 通过多个头文件使用常量变量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 非常量变量只读位置的赋值
- 使用大量已知常量变量的正确方法
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 这些语句是否等效(静态变量、常量变量和泛型)
- 包含常量变量并包含在多个文件中的标头的链接错误
- 我们如何修改常量变量的值
- 如何在模板类中设置静态常量变量
- 为什么常量变量是模板特殊化所必需的,而不是常量
- 如何在函数中传递常量变量?
- 定义常量变量的最佳方法
- C++ 声明常量变量,但推迟其初始化?
- 如何初始化具有常量变量的结构数组
- 使用常量变量作为维度将矩阵声明为类成员时出现编译器错误
- 使用指针 c++ 更改常量变量
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 为什么 lambda 对象中的局部变量是常量变量?
- 使用常量变量作为数组的大小
- 为许多类可能需要的所有常量变量制作独立的头文件是否是一种很好的做法?