gpt4 book ai didi

c++ - 如何减少 constexpr 函数的编译时间?

转载 作者:太空狗 更新时间:2023-10-29 22:55:05 25 4
gpt4 key购买 nike

假设我们想在编译时建立一个非平凡的表

template<int N, int M>
constexpr auto foo()
{
std::array<std::array<int, N>, M> a = {};
for(int m = 1; m < M; m++)
for(int n = 1; n < N; n++)
{
// For exposition only
auto x = (m ^ 42) + (n << 3) - m;
auto y = (n ^ 420) + (m % 420);
a[m][n] = (a[(x + m) % m][(y + n) % n] + (x ^ y)) % 0xFACADE;
}
return a;
}

constexpr auto bar(int n, int m)
{
constexpr auto dim = /* something */;
constexpr auto table = foo<dim, dim>();
return table[n][m];
}

It doesn't take much将编译时间推到最高点。另一种方法是通过脚本将表生成为源代码,这显然不太好。

如何减少此类函数的编译时间?


一些动机

constexpr 函数与常规函数有很大不同,与常规函数相比极其缓慢。除了由编译器执行之外,它们还具有边界检查、溢出检查和几乎所有 UB 预防检查。我怀疑这会使从常规函数中收集到的大多数直觉变得毫无用处。

最佳答案

我想编译器只是优化了以下几点,所以你可能没有任何优势,但是:

1) m ^ 42m % 420不依赖于 n , 所以你可以在内循环之外计算它们

2) 如果我没记错的话,

(x + m) % m  ==  x % m + m % m
== x % m + 0
== x % m

(y + n) % n  ==  y % n + n % n
== y % n + 0
== y % n

3) 你可以尝试添加一些constauto变量。

所以你可以试试

template <int N, int M>
constexpr auto foo ()
{
std::array<std::array<int, N>, M> a = {};

for(int m = 1; m < M; m++)
{
auto const m42 = m ^ 42;
auto const m420 = m % 420;

for(int n = 1; n < N; n++)
{
// For exposition only
auto const x = m42 + (n << 3) - m;
auto const y = (n ^ 420) + m420;
a[m][n] = (a[x % m][y % n] + (x ^ y)) % 0xFACADE;
}
}
return a;
}

如果可行,您可以尝试处理 x % m , 拆分组件 x不依赖于 n ( m42 - m ) 和从属 ( n << 3 ),因此您可以计算 x % m 的一部分在内循环之外。

关于c++ - 如何减少 constexpr 函数的编译时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53250731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com