2015-07-04 2 views
4

Я читаю кое-что о virtual table. Когда дело доходит до указателя __vptr, утверждается, что авторЭто не настоящий указатель?

В отличии от *this указателя, который фактически является параметр функции, используемым компилятором, чтобы решить самостоятельно ссылку, *__vptr реальный указатель. Следовательно, каждый объект класса распределяется больше по размеру одного указателя.

Что означает здесь, говоря, что this на самом деле является параметром функции? И this не настоящий указатель?

+0

Урок, на который вы ссылаетесь, полностью отвечает и объясняет ваш вопрос. Что конкретно вы не понимаете? –

+2

@RedRoboHood На самом деле, я не считаю это понятным в учебнике, и я считаю, что вопрос правильно сформулирован. – Jerska

+4

Учебник передает опасную вводящую в заблуждение информацию. То, что описано, является ** одним возможным способом ** для реализации виртуальных функций. Это не определено в стандарте C++, и оно не обязательно выполняется таким образом с помощью любой конкретной реализации. Хотя V-таблицы являются общей реализацией, это не является строго требованием и, безусловно, не является частью языка C++. – IInspectable

ответ

7

Оба указателя являются реальными в том смысле, что они хранят адрес чего-то еще в памяти. Под «реальным» автор означает «хранится внутри класса», в отличие от указателя this, который передается членам-членам без сохранения в самом объекте. По существу, указатель на __vptr является частью объекта, а указатель this - нет.

+1

Где это хранится? – Allanqunzi

+7

@Allanqunzi Как и любой другой параметр функции, указатель 'this' является временным, он не обязательно сохраняется вообще. Когда вы вызываете функцию-член, скомпилированный код берет адрес объекта, на который вы вызываете функцию, и передает этот адрес как «этот» указатель на функцию-член. Когда функция-член закончена, указатель 'this' исчез. – dasblinkenlight

+0

@dasblinkenlight "переходный указатель". Теперь * этот классный лексикон: p – Quentin

3

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) в %rdiprocessor 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++.

Смежные вопросы