this
является всегда скрытого неявного формального аргумента. Практически, каждая не функция static
члена class
получает неявный первый аргумент, который является this
так в
class Foo {
int x; // a field, i.e. an instance variable
void bar(double x);
};
функция Foo::bar
имеет два аргумента, точно так, как если бы это был C (не C++) функция
void Foo__bar(Foo* mythis, double x);
и на самом деле, name mangling и компилятор преобразует первый в очень тесном эквивалент второго. (Я использую mythis
вместо this
, потому что this
- это ключевое слово в C++).
В принципе, в вашей реализации может быть предусмотрено другое соглашение о передаче для this
(например, использование другого машинного регистра) и для других явных аргументов. На практике это часто нет. В моей системе Linux x86-64 ABI (ее рисунок 3.4, стр. 21) определяет calling convention, который передает this
(и первый аргумент указателя на функцию C) в %rdi
processor register.
Практически говоря, в C++, наиболее -Но не Всероссийским функции-члены малы (определены внутри class
) и inlined по optimizing compiler (и последней C++11 и C++ 14 стандартов были написаны с оптимизирующих компиляторов в виду , см. также this). В этом случае вопрос о том, где хранится this
, становится практически бессмысленным ... (из-за вставки).
virtual method table (виртуальные таблицы) обычно представляет собой неявное первый указатель поле (или переменная экземпляра) объектов, но вещи могут стать более сложными, например, с виртуальными multiple inheritance. сами данные vtable (адреса virtual
) генерируются компилятором. См. Также this answer.
Теоретически реализация C++ может предоставить dynamic method dispatching другим механизмом, чем vtable. На практике я не знаю, как это делает реализация на C++.
Урок, на который вы ссылаетесь, полностью отвечает и объясняет ваш вопрос. Что конкретно вы не понимаете? –
@RedRoboHood На самом деле, я не считаю это понятным в учебнике, и я считаю, что вопрос правильно сформулирован. – Jerska
Учебник передает опасную вводящую в заблуждение информацию. То, что описано, является ** одним возможным способом ** для реализации виртуальных функций. Это не определено в стандарте C++, и оно не обязательно выполняется таким образом с помощью любой конкретной реализации. Хотя V-таблицы являются общей реализацией, это не является строго требованием и, безусловно, не является частью языка C++. – IInspectable