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