Dmitry
Да, пишут его упорки.
"Упорки" звучит как комплемент. Я бы их чуток подругому назвал.
Крылатый
Можно.
Крылатый
А вот это хз.
Constantine
"Упорки" звучит как комплемент. Я бы их чуток подругому назвал.
Ага, а потом сидишь, думаешь как написать и понимаешь, что челики что-то знают
Constantine
Знают как превратить жизнь в ад?
Не, большинство хаков оказывается НА САМОМ ДЕЛЕ НУЖНО
Крылатый
Ремоут добавить через conan remote
Крылатый
Почему? Потом в conan install -r можно указать ремоунт нужный для пакета
Крылатый
ремоут*
Surreal
а это типо супероптимизированный код? Или они просто колдуны?
Не супер, но оптимизированный. В некоторых алгоритмах даже ручной луп анролл есть.
Constantine
тут оффтоп вопрос, безымянный неймспейс будет значить internal linkage для функции?
🐙 Antony
а это типо супероптимизированный код? Или они просто колдуны?
static constexpr void (*_S_vtable[])(void*, void*) = { &__detail::__variant::__erased_swap<_Types&, _Types&>... }; Круто! В первый раз вижу эту магию на практике
🐙 Antony
надо в Boost.Variant так же сделать
Крылатый
Аа... Хм
vladislav
я нипанимать
Constantine
можно ли написать макрос с именем неймспейса и обращением так, чтобы ничего не поломалось для безымянного? :)
vladislav
🐙 Antony
constexpr массив из указателей на type erased функции
🐙 Antony
constexpr массив из указателей на type erased функции
вместо рекурсии или switch будет получение нужной функции по индексу и её выполнение
Berkus
а ремоуты можно указывать для пакаджей? или может есть в conanfile секция [remote0] и т.д.?
Constantine
О! Antony. Слушай, а какие есть продводные камни в 1. Разрешить forward declaration для nested class простейшим синтаксисом class Some; class Some::Nested; 2. Разрешить forward declaration с указанием предков, при этом если предок не один, то _все они_ не могут быть incomplete type. class Base; class Derived: public Base;
Arseny
См. folly::Future
Да, я примерно такой подход и имел в виду.
Dmitry
а без воидов заэкспандить не осилили
🐙 Antony
что именно ты видишь, разжуй плз
// Из этого создастся куча функций, см ниже template<typename _Lhs, typename _Rhs> void __erased_swap(void* __lhs, void* __rhs) { using std::swap; swap(static_cast<_Lhs>(*__lhs), static_cast<_Rhs>(*__rhs)); } void variant<_Types>::swap(variant<_Types>& other_variant) { ... // this.index() == other_variant.index() using func_ptr_t = void(*)(void*, void*); // массив функций static constexpr func_ptr_t _S_vtable[] = { &__erased_swap<_Types&, _Types&>... }; func_ptr_t required_ptr = _S_vtable[this->index()]; // находим нужную функцию required_ptr(this->storage(), other_variant.storage()); // вызываем её }
Dmitry
для типов которые на входе в вариант
🐙 Antony
для каждого типа, который может хранить данный variant
Dmitry
в моем велосипеде тоже через кучу функций https://github.com/reagentoo/libcxx/blob/master/include/variant.h#L192
🐙 Antony
+1
Matway
Мне пришлось полностью выкинуть variant нафиг. Выиграл 25% производительности.
Matway
сборку ускоряешь?
Меня не волнует сборка. Сам продукт работает на 25% быстрее. Пользователь ждёт выполнения программы три секунды вместо четырёх.
Matway
сборку ускоряешь?
Хотя может быть я не понял вопроса, потому что сам продукт тоже выполняет сборку :)
Dmitry
если только сборку самого себя выполняет тогда)
Berkus
йей
Александр
теперь можно пилить отдельные кусочки проги на D и не мучаться с двумя компиляторами?
Александр
там stdlib'ы D статически можно прилинковать?
Александр
Александр
ну это скорее риторический вопрос был
Berkus
нет, я думаю там свой бекенд и рантайм
Aidar
Хочу: constexpr int foo(constexpr int a, int b){ static_assert(a==1); switch(a) { case 1: return do_smth(b); } }
Aidar
чтобы гарантировано было do_smth(b) вместо вызова этой штуки с a==1
Александр
Засунь в шаблон этот параметр
Aidar
Александр
switch на этапе компиляции соптимизируется
Aidar
там свитч тогда нельзя
Aidar
ну он не раскроется
Александр
Почему?
Aidar
не карантировано
Александр
Ээ
Александр
Константы схлопываются
Aidar
там так написано?
Александр
Где?
Aidar
в стандарте
Александр
Не знаю
Aidar
смысл тогда в constexpr функциях с параметрами
Александр
Но например if (1 == 1) точно будет оптимизировано
Aidar
емли все параметры можно через шаблон передать
Александр
Через шаблоны нельзя передать любые типы с constexpr конструктором
Aidar
я же с этого тоже бомбил
Aidar
чо литеральные то нельзя блин
Aidar
чо сложно чтоле
Berkus
я несколько лет назад копал в эту сторону и понял что лучше не надо
Berkus
тогда это было что-то в стиле "у вас опять сломался билд? это потому-то мы поменяли к чертовой матери ВСЕ апи"
Berkus
как сейчас не знаю - возможно у них стабилизировалось всё
Berkus
обычно там есть один-два упорка которые пишут прямо документацию - можно попробовать потыкать в них палочкой
Berkus
чо-то быстрый поиск показывает что с документацией всё ОЧЕНЬ плохо
Berkus
ну для gdb или lldb написать плагин проще - прямо на питоне
Berkus
(я не помню, я тебе кажется даже предлагал из gdb визуализировать сразу)
Berkus
ну там чот много писали сразу
Berkus
и со следующей версией он сломается потому что опять открутят какой-нибудь апи)
Шаурма
апстримить или апдейтить на каждый релиз не так уж и сложно
Berkus
чего