我正在尝试初始化多维数组,虽然有可能在启动时填充一次该数组,但我确实更希望该数组为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数组描述它的原因。
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] 删除。
我来说两句