__fastcall
Только для систем Microsoft
__fastcall соглашение о вызовах указывает, что аргументы функций для передачи в регистрах, если это возможно.В следующем списке показана реализация этого соглашения о вызовах.
Элемент |
Реализация |
---|---|
порядок Аргумент-проходить |
Первое DWORD 2 или более мелкие аргументы передаются в регистре ECX и EDX; любые другие аргументы передаются довольно налево. |
ответственность за Стек-обслуживания |
Вызываемая функция извлекает аргументы из стека. |
соглашение Имя-украшения |
Знак @ присоединен префикс к именам; знак " @ ", за которым следует число байтов (в десятичном числе) в списке параметров suffixed с именами. |
соглашение Обращение-перевода |
Нет доступных преобразования регистра. |
Примечание |
---|
Будущие версии компилятора могут использовать различные регистры для хранения параметров. |
Использование /Gr параметр компилятора вызывает каждую функцию в модуле компилировать как fastcall если функция не объявлена с конфликтующими атрибутом или имя функции main.
Для семейства процессоров Itanium (IPF) и AMD64) компьютеров __fastcall принимает и не обрабатывается компилятором. на обломоке IPF, по соглашению параметры передаются в регистр.
Для non-статических функций класса, если указанная функция вне линия, вызывающий модификатор соглашения не обязательно должен быть определен в определении вне линии.То есть для методов члена класса non-статических, соглашением о вызове, указанное во время объявления принято с точки зрения определения.Учитывая это определение класса
struct CMyClass {
void __fastcall mymethod();
};
this
void CMyClass::mymethod() { return; }
аналогичен этому
void __fastcall CMyClass::mymethod() { return; }
Пример
В следующем примере создается функция с именем 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, ...);