Size: a a a

2021 February 08

D

Dmitriy in pro.cxx
Artöm Bakri Al-Sarmini
Сколько в ней строк?
Не больше десятка. MSVC последний
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Мб в нее заинлайнилось столько, что она сама не стоит того по мнению компиля
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Dmitriy
Пусть есть
template<class Callback, class... Types>
void process_data(Callback c, const Types&... args) { ... }

При вызовах вида process_data([](...){...}) - т.е. от лямбды - в бинаре вижу нечто вида
...
call rax;
...

Даже при включенных оптимизациях.
Понимая, что немного оффтопик, сформулирую вопрос так: какие у компилятора могут быть основания не подставлять тело лямбды?
Никаких вызовов по указателю внутри самой лямбды нет.
Алгоритм инлайнинга никто не описывает, потому что там куча если, но и эвристик
источник

АК

Александр Караев... in pro.cxx
Dmitriy
Пусть есть
template<class Callback, class... Types>
void process_data(Callback c, const Types&... args) { ... }

При вызовах вида process_data([](...){...}) - т.е. от лямбды - в бинаре вижу нечто вида
...
call rax;
...

Даже при включенных оптимизациях.
Понимая, что немного оффтопик, сформулирую вопрос так: какие у компилятора могут быть основания не подставлять тело лямбды?
Никаких вызовов по указателю внутри самой лямбды нет.
template <class Callback>
void process_data(Callback c) {
 c();
}
это тот же самый
template <class Callback>
void process_data(Callback c) {
 /* вызов некоторой известной функции f(), тело которой совпадает с телом лямбды */
}

ну и тут лишь вопрос инлайнинга
источник

D

Dmitriy in pro.cxx
Александр Караев
template <class Callback>
void process_data(Callback c) {
 c();
}
это тот же самый
template <class Callback>
void process_data(Callback c) {
 /* вызов некоторой известной функции f(), тело которой совпадает с телом лямбды */
}

ну и тут лишь вопрос инлайнинга
Да, это понятно - выше как раз шла речь о лямбдах без захвата))
Странное решение. Но оставим его на совести разрабов Microsoft
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Можешь им ишью заслать
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Как missing optimization
источник

АК

Александр Караев... in pro.cxx
Dmitriy
Да, это понятно - выше как раз шла речь о лямбдах без захвата))
Странное решение. Но оставим его на совести разрабов Microsoft
да почему странное-то?
это тоже самое, что спрашивать void process_data(..) { f(); } - почему тут call f, а не тело f
источник

D

Dmitriy in pro.cxx
Александр Караев
да почему странное-то?
это тоже самое, что спрашивать void process_data(..) { f(); } - почему тут call f, а не тело f
Допустим. Почему тогда не call lambda::operator(), а именно по указателю, который берётся из параметров process_data и помещается в rax?
источник

АК

Александр Караев... in pro.cxx
Dmitriy
Допустим. Почему тогда не call lambda::operator(), а именно по указателю, который берётся из параметров process_data и помещается в rax?
всё, я понял вопрос :)
а что кладётся в rax строчками выше?
источник

SK

Stas Koynov in pro.cxx
я думаю call lambda::operator() уже был удален ибо превратился в обычную функцию, захвата ведь не было..
источник

AE

Andrey Enshin in pro.cxx
В C есть такая функция как __libc_csu_init
что значит csu здесь,
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Andrey Enshin
В C есть такая функция как __libc_csu_init
что значит csu здесь,
источник

SK

Stas Koynov in pro.cxx
Dmitriy
Допустим. Почему тогда не call lambda::operator(), а именно по указателю, который берётся из параметров process_data и помещается в rax?
вроде все честно:
https://godbolt.org/z/EoEdbK
может лямбда и правда жирная
источник

D

Dmitriy in pro.cxx
Александр Караев
всё, я понял вопрос :)
а что кладётся в rax строчками выше?
Исходная функция выглядела немного иначе + компиль объединил/заинлайнил часть вызовов до неё.
Насчёт rax я немного присочинил, но суть не меняется.
template <class Callback>
void process_data(uint16_t, uint64_t, Callback c) {
// asm
mov     [rsp+arg_0], rbx
mov     [rsp+arg_10], rbp
mov     [rsp+arg_18], rsi
push    rdi
push    r14
push    r15
...
mov     r15, r8
...
call    r15
}
В промежутках с ... r15 не трогается
источник

AE

Andrey Enshin in pro.cxx
Спасибо!
источник

bt

baby tonight in pro.cxx
sleep_for и sleep_until не гарантируют, что поток не будет заблокирован дольше указанного времени, а если это принципиально и нужно заснуть именно на это время, как добиться гарантии пробуждения вовремя?
источник

ПК

Побитый Кирпич... in pro.cxx
baby tonight
sleep_for и sleep_until не гарантируют, что поток не будет заблокирован дольше указанного времени, а если это принципиально и нужно заснуть именно на это время, как добиться гарантии пробуждения вовремя?
Никак, в обычных ОС вообще нет таких гарантий
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
baby tonight
sleep_for и sleep_until не гарантируют, что поток не будет заблокирован дольше указанного времени, а если это принципиально и нужно заснуть именно на это время, как добиться гарантии пробуждения вовремя?
Переходить на rtos
источник

bt

baby tonight in pro.cxx
ок
источник