Поделиться через


__thiscall

Соглашение о вызовах, определенное корпорацией __thiscall Майкрософт, используется в функциях-членах класса C++ в архитектуре x86. Это соглашение о вызовах по умолчанию, используемое функциями-членами, которые не используют аргументы переменных (vararg функции).

В разделе __thiscallвызываемого абонента очищается стек, что невозможно для vararg функций. Аргументы отправляются в стек справа налево. Указатель this передается через регистр ECX, а не на стеке.

На компьютерах __thiscall ARM, ARM64 и x64 принимается и игнорируется компилятором. Это связано с тем, что они используют соглашение о вызове на основе регистрации по умолчанию.

Одна из причин использования __thiscall — это классы, функции-члены которых используются __clrcall по умолчанию. В этом случае можно использовать __thiscall для вызова отдельных функций-членов из машинного кода.

При компиляции со /clr:pureвсеми функциями и указателями функций не __clrcall указаны в противном случае. /clr:safe Параметры /clr:pure компилятора устарели в Visual Studio 2015 и не поддерживаются в Visual Studio 2017.

vararg функции-члены используют __cdecl соглашение о вызовах. Все аргументы функции отправляются в стек, а this указатель помещается в стек последний.

Так как это соглашение о вызове применяется только к C++, оно не имеет схемы оформления имен C.

При определении функции-члена класса, отличной от статического класса, укажите модификатор соглашения о вызове только в объявлении. Вам не нужно снова указывать его в определении вне строки. Компилятор использует соглашение о вызовах, указанное во время объявления в точке определения.

См. также

Соглашения об передаче и именовании аргументов