Задать вопрос
qweewq
@qweewq
ruby, ruby on rails, devops

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

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

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

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

Похожие вопросы