В сборке источника C ++ ниже. Почему Ракс подталкивается к стеку? < /p>
rax, как я понимаю, из ABI может содержать все из вызовной функции. Но мы сохраняем его здесь, а затем перемещаем стек обратно на 8 байтов. Таким образом, RAX в стеке, я думаю, что это имеет отношение к операции STD :: __ top_bad_function_call () ...? < /p>
Код:-< /p>
#include
void f(std::function a)
{
a();
}
< /code>
Вывод, от gcc.godbolt.org < /code>, используя Clang 3.7.1 -O3: < /p>
f(std::function): # @f(std::function)
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()
< /code>
Я уверен, что причина очевидна, но я изо всех сил пытаюсь понять это. < /p>
Вот хвостовой кал без std :: function < /code> обертка для сравнения: < /p>
void g(void(*a)())
{
a();
}
< /code>
trivial: < /p>
g(void (*)()): # @g(void (*)())
jmp rdi # TAILCALL
Подробнее здесь: https://stackoverflow.com/questions/377 ... -operation