Size: a a a

2020 July 31

AS

Anatoly Shirokov in pro.cxx
Alex
Есть у меня такой шаблон для compile-time итерирования
template <int First, int Last, typename Functor>
constexpr void constexpr_for([[maybe_unused]] Functor&& f) noexcept
{
 if constexpr (First < Last)
 {
    f(value_as_type<First>{});
    constexpr_for<First + 1, Last, Functor>(std::forward<Functor>(f));
 }
}

Когда-то здесь обсуждали, что это эффективнее реализуется на fold expression, но я не видел реализации, и сейчас тоже не могу её найти. Не подскажете?
ну, напиши свой make_index_sequence для диапазона [First, Last) и, в принципе, все, делай fold на index sequence
источник

m

magras in pro.cxx
Alex
Есть у меня такой шаблон для compile-time итерирования
template <int First, int Last, typename Functor>
constexpr void constexpr_for([[maybe_unused]] Functor&& f) noexcept
{
 if constexpr (First < Last)
 {
    f(value_as_type<First>{});
    constexpr_for<First + 1, Last, Functor>(std::forward<Functor>(f));
 }
}

Когда-то здесь обсуждали, что это эффективнее реализуется на fold expression, но я не видел реализации, и сейчас тоже не могу её найти. Не подскажете?
Кажется это пишется примерно так:
template <class F, class... Ts>
void for_each(F&& f, Ts&&... ts) {
 (f(ts), ...);
}


Естественно нужно добавить всякие форварды, я их опустил для краткости.
источник

АК

Александр Караев... in pro.cxx
Alex
Есть у меня такой шаблон для compile-time итерирования
template <int First, int Last, typename Functor>
constexpr void constexpr_for([[maybe_unused]] Functor&& f) noexcept
{
 if constexpr (First < Last)
 {
    f(value_as_type<First>{});
    constexpr_for<First + 1, Last, Functor>(std::forward<Functor>(f));
 }
}

Когда-то здесь обсуждали, что это эффективнее реализуется на fold expression, но я не видел реализации, и сейчас тоже не могу её найти. Не подскажете?
template <std::size_t First, std::size_t... Indices, typename Functor>
constexpr void constexpr_for_impl([[maybe_unused]] Functor&& f, std::index_sequence<Indices...>) noexcept {
   (std::forward<Functor>(f)(value_as_type<First + Indices>{}), ...);
}

template <std::size_t First, std::size_t Last, typename Functor>
constexpr void constexpr_for([[maybe_unused]] Functor&& f) noexcept {
   constexpr_for_impl<First>(std::forward<Functor>(f), std::make_index_sequence<Last - First>{});
}
источник

A

Alex in pro.cxx
magras
Кажется это пишется примерно так:
template <class F, class... Ts>
void for_each(F&& f, Ts&&... ts) {
 (f(ts), ...);
}


Естественно нужно добавить всякие форварды, я их опустил для краткости.
Спасибо, но у меня же числовые индексы (NTTP)
источник

АК

Александр Караев... in pro.cxx
источник

A

Alex in pro.cxx
Спасибо!
А шаблонные лямбды в С++20 поддерживают же и NTTP? Можно выбросить мой костыль value_as_type и использовать шаблонный operator()?
источник

S

Spoonson in pro.cxx
magras
Вчера на афтерпарти Михаил Воронов автор доклада "Jemalloc и ptmalloc2 с точки зрения разработчика" показал интересную оптимизацию в коде jemalloc.

Во-первых, я думаю многим здесь будет интересно посмотреть на нее. Во-вторых, вроде на свежую голову я понял в чем суть, но мне хотелось бы проверить себя.
а можно пояснение для глупых? Никак не могу понять, какую кэшлинию надо будет подгружать, если проверяется возвращаемое значение. Мы же проверяем значение указателя (которое должно быть в регистре, или на стеке рядом), а не то, куда он указывает.
источник

АК

Александр Караев... in pro.cxx
Alex
Спасибо!
А шаблонные лямбды в С++20 поддерживают же и NTTP? Можно выбросить мой костыль value_as_type и использовать шаблонный operator()?
https://godbolt.org/z/x7Tfd1
правда у меня gcc-9 наглухо вис, когда я хотел так его поюзать
источник

AS

Anatoly Shirokov in pro.cxx
Александр Караев
template <std::size_t First, std::size_t... Indices, typename Functor>
constexpr void constexpr_for_impl([[maybe_unused]] Functor&& f, std::index_sequence<Indices...>) noexcept {
   (std::forward<Functor>(f)(value_as_type<First + Indices>{}), ...);
}

template <std::size_t First, std::size_t Last, typename Functor>
constexpr void constexpr_for([[maybe_unused]] Functor&& f) noexcept {
   constexpr_for_impl<First>(std::forward<Functor>(f), std::make_index_sequence<Last - First>{});
}
like
источник

ИИ

Иванов Иванов... in pro.cxx
Александр Караев
template <std::size_t First, std::size_t... Indices, typename Functor>
constexpr void constexpr_for_impl([[maybe_unused]] Functor&& f, std::index_sequence<Indices...>) noexcept {
   (std::forward<Functor>(f)(value_as_type<First + Indices>{}), ...);
}

template <std::size_t First, std::size_t Last, typename Functor>
constexpr void constexpr_for([[maybe_unused]] Functor&& f) noexcept {
   constexpr_for_impl<First>(std::forward<Functor>(f), std::make_index_sequence<Last - First>{});
}
но зачем это?
источник

AS

Anatoly Shirokov in pro.cxx
Иванов Иванов
но зачем это?
источник

ИИ

Иванов Иванов... in pro.cxx
понятно.
источник

m

magras in pro.cxx
Spoonson
а можно пояснение для глупых? Никак не могу понять, какую кэшлинию надо будет подгружать, если проверяется возвращаемое значение. Мы же проверяем значение указателя (которое должно быть в регистре, или на стеке рядом), а не то, куда он указывает.
Моя гипотеза заключалась в том, что речь идет о выражении void *ret = *bin->stack_head; и что в случае success = false было бы необязательно дожидаться загрузки его в кеш. Но это не верно, так как в функции cache_bin_alloc_impl используется значение stack_head в других местах и оно должно уже быть в кеше. Так что у меня теперь тоже нет идей. =(
источник

MZ

Max Ziua in pro.cxx
Можете подкинуть ссылку на имплементацию unique_ptr на стеке? Не могу найти по поиску в чате
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Max Ziua
Можете подкинуть ссылку на имплементацию unique_ptr на стеке? Не могу найти по поиску в чате
На стеке в плане?
источник

MZ

Max Ziua in pro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
На стеке в плане?
С aligned_storage, возможностью передавать кастомный делитер and so on
источник

MZ

Max Ziua in pro.cxx
Я точно здесь это видел, кажись Антон Полухин пилил
источник

MZ

Max Ziua in pro.cxx
С миллионом статик ассертов
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Max Ziua
Я точно здесь это видел, кажись Антон Полухин пилил
Ты про PIMPL?
источник

MZ

Max Ziua in pro.cxx
Нет, я про умный указатель для стековой переменной
источник