Vladislav
видимо автор С++ с 1983 года и не видел
Но как, если они форк шланга пилят?
Matway
https://blogs.msdn.microsoft.com/vcblog/2016/04/06/clangc2-we-need-your-advice/
Stanislav
с2 это ваще какой то другой язык
Stanislav
у майкрософта C1 - фронтенд, C2 - бэкенд )
Stanislav
соответственно клангом они заменили фронтенд часть, а все остальное осталось от vc
Berkus
и это разумно
Berkus
сэкономили на нормальном парсинге плюсов, получили все по стандарту
Berkus
а бэкенд свой оптимизирующий, все как положено
Berkus
попробовали бы они сделать так с гцц
Vladislav
https://blogs.msdn.microsoft.com/vcblog/2016/04/06/clangc2-we-need-your-advice/
Хм, впрочем это поделие тоже форк шланга)
Stanislav
Хм, впрочем это поделие тоже форк шланга)
они вроде в шланг коммитят свои изменения
Matway
Matway
Вот такая красота :(
Stanislav
мда
Stanislav
даже вдруг стало интересно затестить с ним QVariant :)
Arseny
В libc++ на каждый аргумент шаблона по уровню наследования в variant.
Berkus
мкеей
🦥Alex Fails
А чем свитч заменяется? visit(overloaded())?
Это который паттерн посетитель?
Constantine
вижак же код запускается не из под вижака?
Constantine
есть известная фишка, что при запуске под вижаком код медленнее работает
Constantine
и да, а как сделать visitor над variant без линейного перебора, что он хранит?
Andrei
Через виртуальные функции, но не факт, что это быстрее.
Vladislav
Andrei
Ничего не может заинлайниться, промахиваемся мимо кеша инструкций
Andrei
Вряд ли.
Matway
Я пишу variant, который насильно будет делать switch.
Matway
Подброшу вместо системного и сравню.
Nikita
Ничего не может заинлайниться, промахиваемся мимо кеша инструкций
Если по контейнеру надо часто бегать и порядок не важен, то отсортировать можно по типу
Vladislav
Я умею только насильную lookup table делать
Matway
А как, кстати?
Ну, куча шаблонной магии. Я, например, раньше написал замену std::tuple, которая плотно лежит (как структура). std::cout << sizeof(std::tuple<char, char, char, char, char, char, char, double>) << '\n'; --> 64 std::cout << sizeof(Matway::tuple<char, char, char, char, char, char, char, double>) << '\n'; --> 16
Matway
Так что в шаблоны я немножко умею. Попробую чего-нибудь придумать.
Dmitry
Matway
Конструктор копирования variant сделал через switch. Сейчас думаю, как делать visitor.
Matway
Так я умею, а вот шаблонно генерить switch - не очень понятно как
Умеешь плотный тьюпл??? Вообще-то вещь нетривиальная.
Matway
Я бы с удовольствием посмотрел чью-нибудь имплементацию. Ну и поделился своей.
Matway
Потому что я перед тем как это делать, довольно много искал. Видел, как люди пытались, но решили, что это невозможно в C++11.
Andrei
Плотной тупли.
Vladislav
Умеешь плотный тьюпл??? Вообще-то вещь нетривиальная.
В теории, на практике не пробовал) там вся сложность - выбрать оптимальный порядок полей, чтобы минимизировать потерю памяти из-за alignment'а, так?
Dmitry
Плотной тупли.
что это такое?
Matway
что это такое?
std::cout « sizeof(std::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 64 std::cout « sizeof(Matway::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 16
Matway
std::cout « sizeof(std::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 64 std::cout « sizeof(Matway::tuple<char, char, char, char, char, char, char, double>) « '\n'; —> 16
Обычная тупля кладёт элементы крайне неоптимально. В вышеупомянутом случае 65% места пропадает зря.
Dmitry
https://github.com/reagentoo/libcxx/blob/master/include/tuple.h#L670
Vladislav
Так, а double - misaligned, получается?
Matway
Нет, 16. double нужно выровнять.
Andrei
Окей.
Matway
В общем, Matway::tuple имеет всегда ровно такой же размер, как и структура, в которой положили все поля плоско. std::tuple бывает в 16 раз больше.
Dmitry
а чой-то так плохо
Dmitry
у стандартного
Matway
https://github.com/reagentoo/libcxx/blob/master/include/tuple.h#L670
Это совсем не то. Она такая же огромная, как и std::tuple.
Dmitry
да. не в тему кинул.
Matway
Она просто умеет превращаться в union.
Vladislav
В общем, не вижу проблемы так сделать
Matway
Проблема в том, что C++ не позволяет через вариадик положить поля в одну структуру.
Matway
Тупла делается через наследование. И отсюда растут ноги у чудовищного оверхеда.
Dmitry
а из-за чего тупл больше структуры то?
Dmitry
у моего не через наследование)
Matway
Ну, идея такая же - берётся голова (или хвост), засовывается в одну структуру, плюс остаток кладётся туда же.
Matway
И так в цикле.
Matway
И сделать это плотно невозможно.
Dmitry
а если char c[0]; засунуть — тоже неплотно будет?
Vladislav
Я бы посмотрел :)
Напишу, если будет свободное время :)
Matway
Напишу, если будет свободное время :)
Круто! Потом обменяемся реализациями. Может, там разные идеи будут. Было бы зашибись.
Matway
Только чтобы полноценная замена std::tuple. Со всей функциональностью.
Matway
Dmitry
Не понял вопроса, если честно.
я чессно не понял причин неплотности
Dmitry
имелось ввиду засунуть в тупл это как поле