boost :: get vs boost :: apply_visitor при получении значений из варианта - PullRequest
0 голосов
/ 04 января 2019

В нашем производственном коде мы широко используем коллекции boost :: option.Мы извлекаем значения из этой коллекции следующим образом:

for (auto & var : vars)
{
    switch (var.which())
    {
        case 1 :
        AVal = boost::get<A>(var);
        break;
        case 2 :
        BVal = boost::get<B> (var);
        ...
     } 
}

Читая больше о вариантах, я вижу, что другой альтернативой будет

for (auto & var : vars)
{
    switch (var.which())
    {
        case 1 :
        AVal = boost::apply_visitor(AVisitor, var);
        break;
        case 2 :
        BVal = boost::apply_visitor(BVisitor, var);
        ...
    } 
}

Игнорирование того факта, что apply_visitor предоставляет тип времени компиляцииПосещение безопасного значения и является более мощным, следует ли ожидать каких-либо различий с точки зрения производительности во время выполнения для любого из вышеуказанных подходов?

1 Ответ

0 голосов
/ 04 января 2019

boost::variant - это просто блок памяти, который выровнен по наибольшему типу данных, который вы предоставляете, и целое число, указывающее, какой из этих типов используется в настоящее время.И много макросов времени компиляции, учитывающих логику посещений.

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

...