C++ 运行时计算的常量变量

C++ Const Variables calculated during run time?

本文关键字:常量 变量 计算 运行时 C++      更新时间:2023-10-16

在下面的代码中,常量变量 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变量不需要

在编译时计算,即使它们的定义允许这样做。虽然大多数编译器可能会在这种微不足道的情况下实现它,但要求这样做的唯一方法是使变量成为constexprconstexpr将常量表达式的定义推广到变量和函数。此外,它使您不必担心编译器的怪癖,而是明确表示变量值应在编译时可用。

是的,它们被计算一次(编译时),这是从 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