我正在尝试使用boost::hana
来创建一个非常大的constexpr
查找表(最多32768个元素)。这是我的代码:
#include <boost/hana.hpp>
#include <boost/hana/assert.hpp>
namespace hana = boost::hana;
template <typename Count>
static constexpr auto createLookupTable(void)
{
auto indices = hana::make_range(hana::int_c<0>, hana::int_c<Count::value>);
return hana::unpack(indices, [](auto... index)
{
return hana::make_map(
hana::make_pair(
index,
hana::int_c<0>)...);
});
}
int main()
{
constexpr auto lookupTable = createLookupTable<std::integral_constant<unsigned, 128>>();
BOOST_HANA_CONSTANT_CHECK(hana::length(lookupTable) == hana::size_c<128>);
}
出于测试目的,每对的值为hana::int_c<0>
。这被有意义的东西所取代。
编译它需要一些时间。使用hana有更快的方法吗?
由于
答案 0 :(得分:2)
当您处理稀疏索引或键上没有顺序时,映射是表示查找表的正确工具。
由于您将连续的整数作为查找表键处理,因此您应该坚持使用旧的C风格数组,或者更好,std::array<128, your_value_type>
:
constexpr std::array<128, your_value_type> lookupTable = {
// ...
};
一旦你有了这个,你可以将该表的构造委托给constexpr
模板化函数:
template<unsigned size>
constexpr std::array<size, your_value_type> lookupTable()
{
return /* ... */;
}
constexpr auto lookupTable = lookupTable<128>();
答案 1 :(得分:-1)
编译它需要一些时间。有没有更快的方法呢?
我认为这不是hana
特有的(我不知道,我发现了)。模板化C ++代码的编译复杂而且速度慢,并且需要一些时间(因为C ++ template expansion is Turing complete,它可能需要任意大的时间)。
在GCC和Clang的最新版本中,模板化代码的编译得到了显着改善,因此如果可以的话,请使用最新版本(例如2018年5月的GCC 8)。
在实践中(如果你能负担得起),我建议在编译时初始化一大堆POD struct
或者在你的情况下是一个整数数组,也许是通过生成一个C ++(甚至是C) )将其归档,并在初始化时(因此在运行时)将该数组转换为hana
否则,将hana
模板初始化保留在一个单独的文件中,并接受编译需要花费大量时间(但在运行时它会很快运行)。也许ccache可能有用。