使用boost :: hana创建一个大的编译时间映射

时间:2018-05-18 12:45:27

标签: c++ c++17 boost-hana

我正在尝试使用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有更快的方法吗?

由于

2 个答案:

答案 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可能有用。