在下面的代码中,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;
}
答案 0 :(得分:4)
const
变量不需要在编译时计算,即使它们的定义允许也是如此。虽然大多数编译器可能会在如此微不足道的情况下实现它,但要求完成它的唯一方法是将变量设为constexpr
。 constexpr
将constant 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