qweewq
@qweewq
ruby, ruby on rails, devops

Соглашение о работе с ядром в подпрограммах языка С++

В чём разница соглашений языка C++ и, например, Pascal о работе с ядром в подпрограммах? Имеется ввиду то, что очистка стека при выходе из подпрограмм на assembler'e в C++ осуществляется автоматически, а в других языках — нет.
  • Вопрос задан
  • 2784 просмотра
Решения вопроса 1
Rio
@Rio
В C и С++ по-умолчанию стек после вызова очищает вызывающий код. Так сделано было для того, чтобы работали функции с переменным числом параметров (ведь только вызывающий код знает, сколько параметров он положил в стек). В Паскале принято, что стек чистит сама вызываемая функция.

В разных ОС могут быть различные соглашения вызовов API, в Windows принят паскалевский вариант, поэтому все функции ядра Windows объявлены с модификатором __stdcall. Соответственно, модификатор __cdecl определяет функции, использующие сишный договор о передаче параметров.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MikhailEdoshin
Вы имеете в виду calling conventions, т. е. stdcall, fastcall и т. п.? Собственно в этом и разница, одни очищают, другие нет. Если вы не пишете собственную libffi, то остается только следить за правильностью объявлений.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы