C++ Const 变量在运行时计算?

C++ Const Variables calculated during run time?

在下面的代码中,const 变量 B、C 和 P 是在应用程序启动期间计算一次,还是在运行时(即每次调用 parabolicSine 时)计算一次?

正在优化这个,想知道如果我预先计算 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;
}

是的,它们只计算一次(编译时),下面是 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

另请注意,在这种情况下优化根本无关紧要。但是,它可能只是在调用函数时作为常量压入堆栈(如果使用一次左右,取决于编译器)

const 变量不需要在编译时计算,即使它们的定义允许。虽然大多数编译器可能会在这种微不足道的情况下实现它,但要求完成它的唯一方法是使变量成为变量和函数的constexpr. constexpr generalizes the definition of constant expressions。此外,它使您不必担心编译器的怪癖,而是明确指出变量值应该在编译时可用。

它们可能不会在编译时被计算,但它们不会被计算超过一次。 (一个变量只会被初始化一次。)所以它们不可能在每次调用 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