如何在编译时初始化constexpr多维数组?

markt1964

我正在尝试初始化多维数组,虽然有可能在启动时填充一次该数组,但我确实更希望该数组为constexpr,因此我想知道是否有办法让编译器为我做到这一点,特别是因为我可以提供一个constexpr函数,该函数接受每个索引的参数并返回该数组应位于索引处的值。

例如:

constexpr bool test_values[64][64][64][64] = {
... // magic goes here
};

我有一个函数constexpr bool f(int,int,int,int)可以告诉我每个元素应该是什么。我宁愿通过数组访问条目,因为执行数组查找比调用非常量值的f()更快。

我发现的其他大多数与在运行时初始化数组有关的问题都使用std :: array而不是C数组,而且我找不到的是多维的。我曾尝试将多维数组展开为一维数组,并使用std :: array方法,例如我在对该问题的答案之一中找到的方法,但我发现gcc 9.1生成的结果代码仍填充该数组在启动时一次,而不是由编译器直接生成数组。

有什么我可以做的,以使编译器填充这种数组,还是我不得不离开test_values非有效地constexpr而是在运行时进行一次初始化?

编辑:

为了澄清起见,我本质上并不反对使用std :: array而不是内置的C样式数组,但是我不认为std :: arrays对多个维度特别友好,并且使用一维数组会混淆我的程序需要做的(坦率地说,我愿意将它实现为一维std :: array,但是多维数组比手动解开的等尺寸的一维数组要少混淆,这就是为什么我用多维C数组描述它的原因。

贾罗德42

C数组不可复制,因此使用函数实际上是不可能的,但是使用std::array,您可以创建constexpr函数(尽管C ++ 11受限制)

constexpr auto generate()
{
    std::array<std::array<std::array<std::array<bool, 64>, 64>, 64>, 64> res{};

    for (int a = 0; a != 64; ++a) {
        for (int b = 0; b != 64; ++b) {
            for (int c = 0; c != 64; ++c) {
                for (int d = 0; d != 64; ++d) {
                     res[a][b][c][d] = f(a, b, c, d);
                }
            }
        }
    }

    return res;
}

constexpr auto test_values = generate();

如果确实需要C数组,则可以将其包装在结构中并使用类似的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章