M H*_*M H 4 c++ double templates precompiled constexpr
我试图了解const double* const
用作模板的内幕。我有一些非常基本的计算想要高效执行,但是我不知道c ++编译器是如何工作的(汇编代码是什么)。
这个想法是为一个函数创建一个模板,该函数将3个常量double用作模板参数,并将double用作参数。
constexpr double p1 = 1;
constexpr double p2 = 2;
constexpr double p3 = 3;
template <const double* const a,
const double* const b,
const double* const c>
inline double func(double value)
{
constexpr double d = *a - *b;
constexpr double e = *a - *c;
constexpr double ratio = d / e;
constexpr double remain = *c - *a * ratio;
return value * ratio + remain;
}
double func2(double c)
{
return func<&p1,&p2,&p3>(c);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是是否将每个p1,p2,p3 func< p1,p2,p3 >(c)
编译为c * < const value > + < const value >
否则编译器无法在编译时提取const值,并且完整功能将在运行时执行。
查看编译后的输出时,您会看到编译器简化func2
为一个乘法和一个带有两个常量的加法。它甚至不再调用func
。
但是,编译器完全有能力产生相同的代码,而无需处理非类型模板参数:
inline double func(
double const a,
double const b,
double const c,
double const value
) {
double const d = a - b;
double const e = a - c;
double const ratio = d / e;
double const remain = c - a * ratio;
return value * ratio + remain;
}
Run Code Online (Sandbox Code Playgroud)
这将产生完全相同的输出。
标准没有说。甚至没有说代码必须编译-可以解释。
实际上,每个当前的C ++ 都可以编译(尽管有些编译为字节码,然后再进行JIT处理)。此外,我所了解的每个编译器都将避免在运行时对优化的build进行除法。(在未优化的版本中,所有投注均关闭)。
确保唯一的方法是查看生成的程序集-Godbolt.org对此非常有用。