使用const double * const作为模板参数-代码日志

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值,并且完整功能将在运行时执行。

Kon*_*lph 8

查看编译后的输出时,您会看到编译器简化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)

这将产生完全相同的输出。


Mar*_*ica 6

标准没有说。甚至没有说代码必须编译-可以解释。

实际上,每个当前的C ++ 都可以编译(尽管有些编译为字节码,然后再进行JIT处理)。此外,我所了解的每个编译器都将避免在运行时对优化的build进行除法。(在未优化的版本中,所有投注均关闭)。

确保唯一的方法是查看生成的程序集-Godbolt.org对此非常有用。