__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.
При определении функции-члена класса, отличной от статического класса, укажите модификатор соглашения о вызове только в объявлении. Вам не нужно снова указывать его в определении вне строки. Компилятор использует соглашение о вызовах, указанное во время объявления в точке определения.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по