Передача аргументов и соглашения именования
Блок, относящийся только к системам Microsoft
Компиляторы Visual C++ позволяют определять соглашения для передачи аргументов и возвращаемых значений между функциями и вызывающими объектами. Некоторые соглашения доступны не на всех поддерживаемых платформах, и в некоторых соглашениях используются реализации, зависящие от платформы. В большинстве случаев ключевые слова или параметры компилятора, которые задают неподдерживаемое на определенной платформе соглашение, игнорируются, и используется соглашение по умолчанию для данной платформы.
На платформах x86 все аргументы при передаче расширяются до 32 бит. Возвращаемые значения также расширяются до 32 бит и возвращаются в регистре EAX, за исключением 8-байтовых структур, которые возвращаются в паре регистров EDX:EAX. Более крупные структуры возвращаются в регистре EAX в виде указателей на скрытые возвращаемые структуры. Параметры помещаются в стек справа налево. Структуры, не являющиеся данными POD (обычные старые данные), не возвращаются в регистрах.
Компилятор создает код пролога и эпилога для сохранения и восстановления регистров ESI, EDI, EBX и EBP, если они используются в функции.
Примечание
Если функция возвращает структуру, объединение или класс по значению, все определения типа должны быть одинаковыми, в противном случае программа завершается сбоем в среде выполнения.
Дополнительные сведения об определении собственного кода пролога и эпилога функции см. в разделе Вызов функции с атрибутом naked.
Сведения об используемых по умолчанию соглашениях о вызовах в коде, предназначенном для платформ x64, см. в разделе Общие сведения о соглашениях о вызовах для архитектуры x64. Сведения о проблемах с соглашениями о вызовах в коде, предназначенном для платформ ARM, см. в разделе Общие вопросы использования Visual C++ ARM.
Компилятор Visual C/C++ поддерживает следующие соглашения о вызовах.
Ключевое слово |
Очистка стека |
Передача параметров |
---|---|---|
Вызывающая функция |
Параметры помещаются в стек в обратном порядке (справа налево) |
|
Н/Д |
Параметры загружаются в стек выражений CLR по-порядку (слева направо). |
|
Вызываемая функция |
Параметры помещаются в стек в обратном порядке (справа налево) |
|
Вызываемая функция |
Хранятся в регистрах, затем помещаются в стек |
|
Вызываемая функция |
Помещаются в стек; указатель this хранится в регистре ECX |
|
Вызываемая функция |
Хранятся в регистрах, затем помещаются в стек в обратном порядке (справа налево) |
Связанные сведения см. в разделе Устаревшие соглашения о вызовах.
Завершение блока, относящегося только к системам Microsoft