C++, неявный это, и точно как это продвинуто на стеке

Важный момент, который забыли другие ответы, то, что "@keyword" компилируется в "ключевое слово" в CIL.

Поэтому, если у Вас есть платформа, которая была сделана в, скажем, F#, который требует, чтобы Вы определили класс со свойством, названным "классом", можно на самом деле сделать это.

Это не , что полезный на практике, но не наличие это предотвратило бы C# от некоторых форм языка interop.

я обычно вижу, что это использовало не для interop, но избегать ограничений ключевого слова (обычно на именах локальной переменной, где это только эффект), т.е.

private void Foo(){
   int @this = 2;
}

, но я сильно препятствовал бы этому! Просто найдите другое имя, даже если 'лучшее' название переменной является одним из зарезервированных имен.

7
задан starblue 17 October 2009 в 19:56
поделиться

4 ответа

Это зависит от соглашения о вызовах вашего компилятора и целевой архитектуры.

По умолчанию Visual C ++ не помещает это в стек. Для x86 компилятор по умолчанию будет использовать соглашение о вызовах thiscall и передаст его в регистр ecx. Если вы укажете __stdcall для своей функции-члена, она будет помещена в стек в качестве первого параметра.

Для x64 на VC ++ первые четыре параметра передаются в регистрах. Это первый параметр, передаваемый в регистр rcx.

Несколько лет назад Раймонд Чен провел серию статей по соглашениям о вызовах. Вот статьи x86 и x64 .

15
ответ дан 6 December 2019 в 06:37
поделиться

Это будет зависеть от вашего компилятора и архитектуры, но в G ++ 4.1.2 в Linux без настроек оптимизации он обрабатывает this как первый параметр, переданный в регистре:

class A
{
public:
    void Hello(int, int) {}
};

void Hello(A *a, int, int) {}

int main()
{
    A a;
    Hello(&a, 0, 0);
    a.Hello(0, 0);
    return 0;
}

Дизассемблирование main ():

movl    $0, 8(%esp)
movl    $0, 4(%esp)
leal    -5(%ebp), %eax
movl    %eax, (%esp)
call    _Z5HelloP1Aii

movl    $0, 8(%esp)
movl    $0, 4(%esp)
leal    -5(%ebp), %eax
movl    %eax, (%esp)
call    _ZN1A5HelloEii
9
ответ дан 6 December 2019 в 06:37
поделиться

Я только что прочитал стандарт C ++ (ANSI ISO IEC 14882 2003), раздел 9.3.2 «Указатель this», и он, похоже, не указывает ничего о том, где он должен находиться. в списке аргументов, так что это зависит от конкретного компилятора.

Попробуйте скомпилировать некоторый код с помощью gcc, используя флаг '-S', чтобы сгенерировать код сборки, и посмотрите, что он делает.

2
ответ дан 6 December 2019 в 06:37
поделиться

Этот вид деталей не определяется стандартом C ++. Однако прочтите C ++ ABI для gcc (и других компиляторов C ++, следующих за C ++ ABI).

1
ответ дан 6 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: