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, то остается только следить за правильностью объявлений.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект