Size: a a a

2020 October 02

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Нет, не цепочка, а таблица указателей на функции.
Это еще зачем?
источник

CD

Constantine Drozdov in pro.cxx
Хотя если таблица компильтаймовая - см. выше
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
Это еще зачем?
Внутри visit<Visitor> генерируется локальная статическая таблица visitimpl.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Внутри visit<Visitor> генерируется локальная статическая таблица visitimpl.
ну это тот же switch в виде сбоку
источник

CD

Constantine Drozdov in pro.cxx
все возможные адреса переходов известны, а в TypeErasure - неизвестен
источник

DS

Dmitry Sokolov in pro.cxx
Constantine Drozdov
ну это тот же switch в виде сбоку
Ну не факт что компилятор такое разложит в switch, а значит будет call, что по стоимости то же что function, а может и дороже, ведь в таблицу ещё почитать надо сходить.
источник

DS

Dmitry Sokolov in pro.cxx
Недавно кажется @kostja_osipov по этому поводу на variant как раз ругался.
источник

CD

Constantine Drozdov in pro.cxx
Dmitry Sokolov
Ну не факт что компилятор такое разложит в switch, а значит будет call, что по стоимости то же что function, а может и дороже, ведь в таблицу ещё почитать надо сходить.
Ну вот смотри. Представь, что у тебя все std::function тегированы (т.е. добавлен дополнительный шаблонный параметр), чтобы несовместимые стали несовместимыми. В этом случае компилятор за счет internal linkage параметров конструктора имеет шанс понять, что тут вызов по таблице - прийти к switch.
А если компилятор не может разложить в switch конструкцию вида
#include <array>

namespace {
   void foo() {}
   void bar() {}
}
int f(int n) {
   constexpr std::array x = { &foo, &bar };
   x[n]();
}

да еще и сгенерированную в std, это, кажется, надо писать репорт в компилятор
источник

CD

Constantine Drozdov in pro.cxx
у компилятора в данном случае намного больше информации, чем просто при вызове функции по указателю, и если он сделал это медленнее - это крякает как баг
источник

AT

Anatoly Tomilov in pro.cxx
Dmitry Sokolov
Диспетчеризация variant это вызов одной из сгенерированных прокси функций по номеру. Диспетчеризация function вызов той же proxy функции по указателю который лежит в самой function.
не обязательно. В первых реализациях до стандартизации я видел рекурсивные вызовы с if-ами по значению дискриминатора
источник

DS

Dmitry Sokolov in pro.cxx
Anatoly Tomilov
не обязательно. В первых реализациях до стандартизации я видел рекурсивные вызовы с if-ами по значению дискриминатора
В boost рекурсивный switch. В clang/gcc таблицы. В msvc не смотрел...
источник

NV

Nik Vzdornov in pro.cxx
Constantine Drozdov
Ну вот смотри. Представь, что у тебя все std::function тегированы (т.е. добавлен дополнительный шаблонный параметр), чтобы несовместимые стали несовместимыми. В этом случае компилятор за счет internal linkage параметров конструктора имеет шанс понять, что тут вызов по таблице - прийти к switch.
А если компилятор не может разложить в switch конструкцию вида
#include <array>

namespace {
   void foo() {}
   void bar() {}
}
int f(int n) {
   constexpr std::array x = { &foo, &bar };
   x[n]();
}

да еще и сгенерированную в std, это, кажется, надо писать репорт в компилятор
Но как я понимаю если есть необходимость добавлять колбэки динамически, то конкретно этот вариант не подходит, можно конечно variant + vector к примеру, но даже этот вариант не подойдёт для лямбд с контекстом
источник

D

Dmitriy in pro.cxx
Dmitry Sokolov
В boost рекурсивный switch. В clang/gcc таблицы. В msvc не смотрел...
Емнип, рекурсия в MSVC
источник

AT

Anatoly Tomilov in pro.cxx
Dmitry Sokolov
Нет, не цепочка, а таблица указателей на функции.
я помню multivisit с цепочкой ифов в рекурсии в унарном visit компилировался быстрее и в рантайме (не очень точно, конечно) был быстрее, что меня удивляло в то время
источник

AT

Anatoly Tomilov in pro.cxx
вот такие тесты делал с размерностью 5x5 (3125 вариантов operator () визитора) 5 аргументов-вариантов для 5 типов boost, eggs, мой
источник

AT

Anatoly Tomilov in pro.cxx
когда начали стандартизировать, то появилась какая-то предварительная имплементация, уж не помню где она — так вот она для multivisitor-а какую-то жуткую шаблонную рекурсию делала, и это было сильно быстрее, чем таблицы указателей на функции
источник

SZ

Sergo Zar in pro.cxx
я заполняю массив 100 рандомых чисел, записываю в другой массив все отрицательные числа с первого массива, вывожу значение второго массива и почемуто не вижу ни одного числа которое записал в него. Почему?
источник

D

Danya in pro.cxx
Sergo Zar
я заполняю массив 100 рандомых чисел, записываю в другой массив все отрицательные числа с первого массива, вывожу значение второго массива и почемуто не вижу ни одного числа которое записал в него. Почему?
Ошибка на строке 228
источник

D

Danya in pro.cxx
Но вообще
1. Слова ничто — код всё
2. @supapro — пиши сюда
источник

SZ

Sergo Zar in pro.cxx
Код кинуть?
источник