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

时间:2015-01-01 07:33:35

标签: c++

在下面的代码中,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;
}

4 个答案:

答案 0 :(得分:4)

const变量不需要在编译时计算,即使它们的定义允许也是如此。虽然大多数编译器可能会在如此微不足道的情况下实现它,但要求完成它的唯一方法是将变量设为constexprconstexprconstant expressions的定义概括为变量和函数。此外,它使您不必担心编译器怪癖,而是明确表示变量值应该在编译时可用。

答案 1 :(得分:1)

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

还要注意,在这种情况下,优化并不重要。但是,它可能只是在调用函数时作为常量被推入堆栈(如果使用一次,那么,取决于编译器)

答案 2 :(得分:1)

它们可能不会在编译时计算,但它们的计算时间不会超过一次。 (变量只会被初始化一次。)因此,每次调用ParabolicSine时都不会对它们进行评估。

答案 3 :(得分:1)

它的编译器。请考虑以下示例。

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