Бөлісу құралы:


__fastcall

Блок, относящийся только к системам Майкрософт

Соглашение __fastcall о вызовах указывает, что аргументы функций передаются в регистрах, когда это возможно. Это соглашение о вызовах применяется только к архитектуре x86. В следующем списке показана реализация этого соглашения о вызовах.

Элемент Внедрение
Порядок передачи аргументов Первые два DWORD или меньших аргумента, найденные в списке аргументов слева направо, передаются в регистрах ECX и EDX. Все остальные аргументы передаются в стек справа налево.
Обязанность по обслуживанию стека Вызываемая функция извлекает аргументы из стека.
Соглашение об оформлении имен При знаке (@) префикс в имена; при входе, за которым следует число байтов (десятично) в списке параметров, суффиксируется в имена.
Соглашение о преобразовании регистра Изменение регистра не выполняется.
Классы, структуры и профсоюзы Обрабатывается как "многобайтовые" типы (независимо от размера) и передается в стек.
Перечисления и классы перечисления Передается по регистру, если их базовый тип передается регистром. Например, если базовый тип имеет int размер unsigned int 8, 16 или 32 бита.

Примечание.

В следующих версиях компилятора могут использовать другие регистры для сохранения параметров.

Использование параметра компилятора /Gr приводит к компиляции каждой функции в модуле, __fastcall если функция не объявлена с помощью конфликтующего атрибута или имя функцииmain.

Ключевое __fastcall слово принимается и игнорируется компиляторами, предназначенными для архитектур ARM и x64; на микросхеме x64 по соглашению первые четыре аргумента передаются в регистрах, когда это возможно, и дополнительные аргументы передаются в стеке. Дополнительные сведения см . в соглашении о вызовах x64. На микросхеме ARM можно передавать в регистрах до четырех целочисленных аргументов и до восьми аргументов с плавающей запятой; дополнительные аргументы передаются в стеке.

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

struct CMyClass {
   void __fastcall mymethod();
};

вид:

void CMyClass::mymethod() { return; }

эквивалентен следующему:

void __fastcall CMyClass::mymethod() { return; }

Для совместимости с предыдущими версиями является синонимом, _fastcall если не указан параметр __fastcall компилятора /Za (отключить расширения языка).

Пример

В следующем примере аргументы передаются в функцию DeleteAggrWrapper в регистрах.

// Example of the __fastcall keyword
#define FASTCALL    __fastcall

void FASTCALL DeleteAggrWrapper(void* pWrapper);
// Example of the __ fastcall keyword on function pointer
typedef BOOL (__fastcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

Завершение блока, относящегося только к системам Майкрософт

См. также

Передача аргументов и соглашения об именовании
Ключевые слова