Arseny
я про ссылку на SO. там std::function<void()> и std::function<void(int)>
Note that there's been a slight change to the wording above, due to LWG 2420: There's an exception that if the return type R of a std::function<R(ArgTypes...)> is void, then any return type is accepted (and discarded) for the Callable in the constructor template mentioned above. For example, both []() -> void {} and []() -> bool {} are Callable for std::function<void()>
Roman
хммм, я немного растерян этим немалым потоком инфы, в данном случае я пытаюсь упростить интерфейс библиотеки чтоб не приходилось писать:
->attach([](
const StreamHandle& handle,
const QVariant& data,
) {
Q_UNUSED(stream)
Q_UNUSED(data)
// ...
return nullptr;
})
а можно бы было просто:
->attach([]() {
// ...
})
Roman
это вообще, в таком случае, возможно?
Arseny
Не возвращайте void
Возвращайте, допустим, struct Unit{};
Surreal
Anatoly
да можно оставить и Reference и возвращать nullptr
Anatoly
без перегрузки attach
Anatoly
в сущности перегрузка с void это всего лишь сахар
Surreal
Anatoly
в любом случае, результат выполнения функция не учавствует в процессе разрешения перегрузки
Anatoly
int boo() {return 0;}
void boo() {}
Anatoly
не скомпилируется
Anatoly
отсюда и std::function ведет себя подобным образом
Stanislav
Roman
короче нельзя перегрузить attach разными типами ламбды
Roman
придётся тогда nullptr возвращать по старинке
Anatoly
можно, если будут разные сигнатуры
Anatoly
ну, если они будут отличатся числом или типом параметров
Roman
Anatoly
можно
Roman
можно
ну так иначе же хрень будет с resolving'ом?
Arseny
std::function<void(void)> x = []{return std::string();};
компилируется. В этом проблема
Anatoly
можно, если нет перегрузки с таким же типом и числом аргументов, но отличающейся типом результата
Anatoly
Danil
Danil
лол, очевидно же
Arseny
Anonymous
хай. соре за нубский вопрос. Скажите, плз, какую версию С++ желательно учить? по какой больше материала? начал учить питон, такое чувство что превращаешься в зомби-кодера, без понимания что как работает
Surreal
Anatoly
Vladislav
Алдар
Anonymous
лан.
Matway
Сижу, переписываю красивый код с std::variant обратно на switch. std::variant не просто тормозит, а ужасно тормозит. В ассемблере полная каша. На MSVC variant замедляет мой код на 70%, на Clang - 30%.
Matway
Разумеется, -O3
Stanislav
Matway
Вот так вот программист не должен платить за абстракции, ага.
Anatoly
а код не под управлением чего-то гитоподобного?
Anatoly
откатится нельзя?
Matway
Гит, да. Куда откатиться?
Anatoly
или ты с нуля написал и теперь отказался, сорри не понял
Matway
Мы месяца четыре назад с радостным улюлюканьем перебежали на std::variant. А вот сегодня я засел профайлить.
Anatoly
а профилировщик на что показывает? какие места проседают? я бы попробовал, если у тебя есть синтетический тест
Matway
Собственно, во внутренности variant и показывает.
Vladislav
Matway
В моём понимании, эта штука должна полностью уйти в процессе оптимизации. Ан нет. Попытался почитать ассемблер - там кошмар.
Vladislav
Matway
А он у тебя прямо в critical path используется?
Остальной код писан осторожно, каждый лишний if на счету. Вот на фоне кода, который писался с производительностью в уме, variant и "заиграл". В обычном коде думаю не было бы так критично.
Matway
Ну то есть буквально - со switch наш компилятор компилирует большой проект 30 секунд, а с variant - 51 секунду.
Vladislav
Vladislav
Matway
А в гцц?
Нет под рукой, к сожалению. Мы используем только MSVC и Clang. Будет время - попробую.
Matway
Что интересно, с variant MSVC и Clang собирают одинаковый по производительности код.
Stanislav
Matway
Но со switch MSVC ускоряется гораздо сильнее, чем Clang.
Matway
В ассебмлере вообще не вижу выборки из switch-таблицы. Похоже, variant компилируется в серию бранчей. Это грустно.
Stanislav
возможно ли написать вариант который работал бы аналогично быстро?
Vladislav
Matway
Vladislav
23
А чем свитч заменяется? visit(overloaded())?
Matway
Да.
Matway
overload я писал руками, но там вроде нечему портить картину. На всякий случай перепроверил на собранной ручками структуре - те же дела.
Matway
Matway
Официально - Clang with Microsoft CodeGen
Matway
Майкрософт прикинулся Шлангом...
Anatoly
только 32 битный?
Matway
только 32 битный?
Нет, x64 вполне собирает и работает. Там идея простая - берётся слегка модифицированный Шланг, генерирует LLVM IR. А потом с этим работает Microsoft CodeGen - LLVM Backend от Майкрософта.
Vladislav
http://c2lang.org/site/introduction/languages.svg
Stanislav