В сборке источника С++ ниже. Почему RAX нажата в стек?
RAX, как я понимаю, из ABI может содержать что-либо от вызывающей функции. Но мы сохраним его здесь, а затем переместим стек обратно на 8 байтов. Таким образом, RAX в стеке, я думаю, имеет значение только для операции std::__throw_bad_function_call()
...?
Код: -
#include <functional>
void f(std::function<void()> a)
{
a();
}
Выход из gcc.godbolt.org
, используя Clang 3.7.1 -O3:
f(std::function<void ()>): # @f(std::function<void ()>)
push rax
cmp qword ptr [rdi + 16], 0
je .LBB0_1
add rsp, 8
jmp qword ptr [rdi + 24] # TAILCALL
.LBB0_1:
call std::__throw_bad_function_call()
Я уверен, что причина очевидна, но я изо всех сил пытаюсь понять это.
Здесь хвост без оболочки std::function<void()>
для сравнения:
void g(void(*a)())
{
a();
}
Тривиальное:
g(void (*)()): # @g(void (*)())
jmp rdi # TAILCALL