1

我正在尝试使用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?

谢谢

4

2 回答 2

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>();
于 2018-05-18T13:14:03.267 回答
0

编译这个需要一些时间。有更快的方法吗?

我认为它不是特定于hana(我不知道并且我正在发现)。模板化 C++ 代码的编译既复杂又缓慢,并且需要一些时间(由于 C++模板扩展是图灵完备的,因此可能需要很长的时间)。

在最新版本的GCC和 Clang 中,模板化代码的编译有了显着改进,所以如果可以的话,请使用最新版本(例如2018 年 5 月的GCC 8 )。

在实践中(如果你能负担得起的话),我建议struct在编译时初始化一个大的 POD 数组,或者在你的情况下初始化一个整数数组,也许通过生成一个生成的 C++(甚至 C)文件,并在初始化时(所以在运行时)将该数组转换为您的hana

否则,将hana模板初始化留在某个单独的文件中,并接受编译需要大量时间(但在运行时它会运行得非常快)。也许ccache可能有用。

于 2018-05-18T13:10:10.757 回答