D
Size: a a a
D
AB
AB
template<class Callback, class... Types>
void process_data(Callback c, const Types&... args) { ... }
process_data([](...){...})
- т.е. от лямбды - в бинаре вижу нечто вида...
call rax;
...
АК
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
template <class Callback>это тот же самый
void process_data(Callback c) {
c();
}
template <class Callback>ну и тут лишь вопрос инлайнинга
void process_data(Callback c) {
/* вызов некоторой известной функции f(), тело которой совпадает с телом лямбды */
}
AB
AB
АК
void process_data(..) { f(); }
- почему тут call f
, а не тело f
D
void process_data(..) { f(); }
- почему тут call f
, а не тело f
call lambda::operator()
, а именно по указателю, который берётся из параметров process_data
и помещается в rax
?АК
call lambda::operator()
, а именно по указателю, который берётся из параметров process_data
и помещается в rax
?SK
call lambda::operator()
уже был удален ибо превратился в обычную функцию, захвата ведь не было..AE
__libc_csu_init
AB
__libc_csu_init
SK
call lambda::operator()
, а именно по указателю, который берётся из параметров process_data
и помещается в rax
?D
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
bt
ПК
AB
bt