关于 c:如何将模板大小的数组初始化转换为 constexpr 初始化?

How to convert template-sized array initialization to constexpr initialization?

这是循环。基本上沿圆的圆周生成一定数量的点。点数组显然是恒定的


不能保证它们绝对准确,但它们可能足以满足您的目的。

我只是使用了泰勒级数近似。添加 constexpr 并查看它们是否有效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
long double sin2r(long double const r, long double const t, long double const tn, unsigned long long k)
{
    return tn == 0 ? r : sin2r(r + ((k / 2) % 2 ? -1 : +1) * tn, t, tn * t * t / ((k + 1) * (k + 2)), k + 2);
}

long double cos2r(long double const r, long double const t, long double const tn, unsigned long long k)
{
    return tn == 0 ? r : cos2r(r + ((k / 2) % 2 ? -1 : +1) * tn, t, tn * t * t / ((k + 1) * (k + 2)), k + 2);
}

long double sin2(long double const t)
{
    return sin2r(0, t, t, 1);
}

long double cos2(long double const t)
{
    return cos2r(0, t, 1, 0);
}


首先,constexpr 函数不一定在编译时进行评估。在某些情况下编译器必须这样做(例如,如果事物被用作编译时间常数);但标准不需要这样的东西。 (理论上,如果存储生成代码并在启动时运行一次是微不足道的并且使用的空间比存储 constexpr 的计算值少,那么编译器可能希望这样做)

其次,你的例子是不可能做出constexpr的。该标准要求任何 constexpr 函数只能调用其他 constexpr 函数,并且格式为 return expression;。您的示例不符合任何条件,因为您依赖于 sincos (它们不是 constexpr 函数),并且您需要一个循环,它不是 return expression;.

的形式

constexpr 不是为优化而设计的;它旨在允许您计算编译时间常数(例如,以便您可以将结果用作堆栈分配数组的大小)。