Создание большой карты времени компиляции с использованием boost :: hana - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь использовать 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>.Это заменяется чем-то значимым.Это займет некоторое время, чтобы скомпилировать это.Есть ли более быстрый способ сделать это с помощью хана?

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Карты - это правильный инструмент для представления справочной таблицы, когда вы работаете с разреженными индексами или когда нет ключей для ключей.

Поскольку вы имеете дело с непрерывными целыми числами в качестве ключей поисковой таблицы, выдействительно следует придерживаться старых массивов в стиле 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>();
0 голосов
/ 18 мая 2018

Требуется некоторое время, чтобы скомпилировать это.Есть ли более быстрый способ сделать это?

Я не думаю, что это специфично для hana (который я не знаю и который я открываю).Компиляция шаблонного кода C ++ является сложной и медленной и занимает некоторое время (поскольку расширение шаблона C ++ завершено по Тьюрингу , это может занять произвольно большое время).

Компиляция шаблонного кода значительноулучшено в последних версиях GCC и Clang, поэтому используйте последнюю версию (например, GCC 8 в мае 2018 года), если можете.

На практике (если выЯ могу рекомендовать инициализировать большой массив POD struct s или, в вашем случае, массив целых чисел во время компиляции, возможно, с помощью сгенерированного файла C ++ (или даже C), а также при инициализации (так что привремя выполнения) преобразуйте этот массив в hana

В противном случае оставьте инициализацию шаблона hana в отдельном файле и примите, что компиляция занимает много времени (но во время выполнения она будет выполняться очень быстро).Возможно, ccache может быть полезным.

...