__thiscall

 

Самая актуальная документация по Visual Studio 2017: Документация по Visual Studio 2017.

Соглашение о вызовах __thiscall используется для функций-членов. Оно по умолчанию используется функциями членами C++, в которых не используются переменные-аргументы. В соглашении о вызовах __thiscall вызываемый метод очищает стек, что невозможно для функций vararg. В архитектуре x86 аргументы отправляются в стек справа налево, причем указатель this передается через регистр ECX, а не помещается в стек.

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

При компиляции с параметром /clr:pure все функции и указатели на функции используют соглашение о вызовах __clrcall, если не указано иное.

В версиях до Visual C++ 2005 соглашение о вызовах thiscall не могло быть явным образом указано в программе, поскольку thiscall не являлось ключевым словом.

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

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

На машинах с архитектурой ARM и x64 ключевое слово __thiscall принимается и игнорируется компилятором.

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

// thiscall_cc.cpp  
// compile with: /c /clr:oldSyntax  
struct CMyClass {  
   void __thiscall mymethod();  
   void __clrcall mymethod2();  
};  

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

Показ: