Почему эта функция подталкивает RAX в стек в качестве первой операции?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему эта функция подталкивает RAX в стек в качестве первой операции?

Сообщение Anonymous »

В сборке источника 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

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

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»