A соглашение о вызовах описывает, как что-то может вызывать другую функцию. Это требует передачи параметров и состояния другой функции, чтобы она могла правильно выполнять и возвращать управление. Способ, которым это делается, должен быть стандартизирован и определен, чтобы компилятор знал, как упорядочить параметры для потребления вызываемой удаленной функцией. Существует несколько стандартных соглашений о вызовах, но наиболее распространенными являются fastcall
, stdcall
и cdecl
.
Обычно термин пользовательское соглашение о вызовах является немного неправильным и относится к одной из двух вещей:
Нестандартное соглашение о вызовах или соглашение, которое не широко используется (например, если вы строите архитектуру с нуля).
Специальная оптимизация, которую может выполнить компилятор / компоновщик, использующий соглашение об одноразовом вызове с целью повышения производительности.
В последнем случае это приводит к тому, что некоторые значения, которые иначе были бы помещены в стек, вместо этого будут сохраняться в регистрах. Компилятор попытается принять это решение, основываясь на том, как параметры используются внутри кода. Например, если параметр будет использоваться в качестве максимального значения для индекса цикла, так что индекс сравнивается с максимальным на каждой итерации, чтобы увидеть, должны ли вещи продолжаться, это было бы хорошим случаем для его перемещения в регистр.
Если оптимизация выполняется, это обычно уменьшает размер кода и повышает производительность.
И как на меня это влияет, как на разработчика?
С вашей точки зрения, как разработчика, вам, вероятно, все равно; это оптимизация, которая произойдет автоматически.