/Gd, /Gr, /Gv, /Gz (соглашение о вызовах)

Данные параметры определяют порядок, в котором аргументы функции передаются в стек, вызывающая или вызываемая функция удаляет аргументы из стека в конце вызова, а также соглашение об именах, используемое компилятором для идентификации отдельных функций.

/Gd
/Gr
/Gv
/Gz

Заметки

/Gd (параметр по умолчанию) указывает соглашение о вызовах __cdecl для всех функций за исключением функций-членов C++ и функций, помеченных как __stdcall, __fastcall или __vectorcall.

/Gr указывает соглашение о вызовах __fastcall для всех функций за исключением функций-членов C++, функций с именем main и функций, помеченных как __cdecl, __stdcall или __vectorcall. Все функции __fastcall должны иметь прототипы. Это соглашение о вызовах доступно только в компиляторах, целевому объекту x86 и игнорируется компиляторами, нацеленными на другие архитектуры.

/Gz указывает соглашение о вызовах __stdcall для всех функций за исключением функций-членов C++, функций с именем main и функций, помеченных как __cdecl, __fastcall или __vectorcall. Все функции __stdcall должны иметь прототипы. Это соглашение о вызовах доступно только в компиляторах, целевому объекту x86 и игнорируется компиляторами, нацеленными на другие архитектуры.

/Gv задает соглашение о вызовах __vectorcall для всех функций, за исключением функций-членов C++, функций с именем main, функций с переменным числом аргументов vararg или функций, которые помечены конфликтующим атрибутом __cdecl, __stdcall или __fastcall. Это соглашение о вызовах доступно только в архитектурах x86 и x64, поддерживающих /arch:SSE2 и выше, и игнорируются компиляторами, нацеленными на архитектуру ARM.

Функция, принимающая переменное число аргументов, должна быть помечена как __cdecl.

/Gd, /Gr, /Gv и /Gz несовместимы с /clr:safe или /clr:pure.

Примечание

Для процессоров x86 функции-члены С++ по умолчанию используют __thiscall.

Для всех процессоров функция-член, которая явно помечена как __cdecl, __fastcall, __vectorcall или __stdcall, использует указанное соглашение о вызовах, если оно не игнорируется в данной архитектуре. Функция-член, которая принимает переменное число аргументов, всегда использует соглашение о вызовах __cdecl.

Эти параметры компилятора не влияют на именование методов и функций C++. Методы и функции C++ используют другую схему именования, если только они не объявлены как extern "C". Для получения дополнительной информации см. Внутренние имена.

Дополнительные сведения о соглашениях о вызовах см. в разделе Соглашения о вызовах.

Особенности __cdecl

Для процессоров x86 аргументы функции передаются в стек справа налево. В архитектурах ARM и x64 некоторые аргументы передаются реестром, остальные передаются на стек справа налево. Вызывающая функция извлекает аргументы из стека.

Для языка С в соглашении об именах __cdecl используется имя функции, которому предшествует символ подчеркивания ( _ ). Изменения регистра не происходит. Функции C++ используют другую схему именования, если только они не объявлены как extern "C". Для получения дополнительной информации см. Внутренние имена.

Особенности __fastcall

Некоторые аргументы функции __fastcallпередаются в регистрах (для процессоров x86, ECX и EDX), а остальные передаются в стек справа налево. Вызываемая процедура извлекает из стека эти аргументы до возвращения. Как правило, параметр /Gr снижает время выполнения.

Примечание

Следует соблюдать осторожность при использовании соглашения о вызовах __fastcallдля любой функции, написанной на языке встроенной сборки.Использование регистров не должно конфликтовать с их использованием компилятором.

Для языка C соглашение об именах __fastcall использует имя функции, которому предшествует символ @. Затем следует размер аргументов функции в байтах. Изменения регистра не происходит. Компилятор использует шаблон для соглашения об именах.

@function_name@number

При использовании соглашения об именах __fastcall следует использовать стандартные включаемые файлы. В противном случае могут образоваться неразрешаемые внешние ссылки.

Особенности __stdcall

Аргументы функции __stdcall передаются в стек справа налево, а вызываемая функция извлекает эти аргументы перед возвращением.

Для языка С соглашение об именах __stdcall использует имя функции, которому предшествует символ подчеркивания ( _ ) и за которым следует знак "@" и размер аргументов функции в байтах. Преобразование регистра не выполняется. Компилятор использует шаблон для соглашения об именах.

_functionname@number

Особенности __vectorcall

Целые аргументы функции __vectorcall передаются по значению, используя до двух (в x86) или четырех (в x64) целочисленных регистров и до шести регистров XMM для значений с плавающей запятой и векторов; остальное передается в стеке справа налево. Вызываемая функция очищает стек перед возвращением. Векторные возвращаемые значения и возвращаемые значения с плавающей запятой возвращаются в XMM0.

Для языка C соглашение об именах __vectorcall использует имя функции, за которым следуют два символа собаки (@@) и размер аргументов функции в байтах. Преобразование регистра не выполняется. Компилятор использует шаблон для соглашения об именах.

functionname@@number

См. также

Ссылки

Параметры компилятора

Настройка параметров компилятора