Соглашение о вызовах ОЧЕНЬ важно, но вам редко приходится задумываться.
Это становится актуальным при нацеливании на другие ОС или объекты \ библиотеки, написанные на других языках (например, на паскале или около того).
Он определяет, какие и как параметры помещаются в стек (вызывающей стороной) и кто отвечает за извлечение этих параметров из стека при возврате вызываемой функции.
Поскольку C \ C ++ поддерживает список переменных параметров, вызывающая сторона должна вытолкнуть стек (так как вызываемый не знает, сколько ему передано параметров).
Следовательно, это приводит к большому сгенерированному коду (каждый вызов функции расширяется с помощью кода pop-stack).
Однако языки, которые изначально не допускают списки переменных параметров, могут взять на себя бремя вытягивания самого стека из де вызываемой функции (они всегда знают, как она вызывается).
В результате получается только один фрагмент кода, извлекаемого из стека (в конце вызываемого абонента), и, следовательно, генерируется меньше кода.
Более того, язык может выбирать способ размещения параметров в стеке.
Он может выбирать параметры в том же порядке, в каком они записаны в вызове (первый параметр первым, последний параметр последним)
или он может выбрать последний параметр первым и последний параметр последним (как это делает C \ C ++).
Последнее позволяет «легко» реализовать список переменных параметров.
если вы не используете переменный список параметров, вы можете выбрать другое соглашение о вызовах по умолчанию (например, PASCAL).
Однако это означает, что каждая функция, для которой не указано соглашение о вызовах, будет обрабатываться с выбранным соглашением.
Если объявления не совпадают с их реализацией, вы, вероятно, получите неразрешенные внешние ошибки (в лучшем случае) или серьезные ошибки времени выполнения или (в худшем случае) ошибочные вычисления.
В качестве практического примера:
Я работал программистом для производителя мобильных компьютеров.
Они использовали специальный (ограниченный) компилятор для генерации компактного кода (у мобильного компьютера была очень ограниченная память), поскольку MSVC генерировал большие объекты.
Я предложил изменить соглашение c-call на соглашение pascal-call и некоторые другие незначительные изменения.
С тех пор они могли бы использовать более сложный компилятор (MSVC) и делать намного больше.