В сборке источника 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
Почему эта функция подталкивает RAX в стек в качестве первой операции? ⇐ C++
Программы на C++. Форум разработчиков
1740312460
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
Подробнее здесь: [url]https://stackoverflow.com/questions/37773787/why-does-this-function-push-rax-to-the-stack-as-the-first-operation[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия