__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, ...);
Завершение блока, относящегося только к системам Майкрософт
См. также
Передача аргументов и соглашения об именовании
Ключевые слова