Топ контрибуторов
loading
loading
Знаете ли Вы, что

После прохождения теста можно комментировать вопросы теста, а Ваши комментарии увидят модераторы теста и пользователи, которым когда-либо эти вопросы попадались.

Лента обновлений
ссылка 14:57:26
Комментарий от sashka228:
согласна
ссылка 14:56:54
Комментарий от sashka228:
#ресоурсескотився
ссылка 14:54:17
Комментарий от sashka228:
yep.
ссылка 14:12:03
Добавлен вопрос в тест C++ - Средний уровень
ссылка 14:00:35
Комментарий от Anton_2015:
Гарне питання
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 445771 / 2188313.

Размеры указателей в C++ (pointer size)

head tail Статья
категория
C++
дата18.08.2009
авторgeolip
голосов22

Заранее оговорюсь о том, что конкретные значения размеров указателей могут варьироваться от компилятора к компилятору. Значения приведенные в данной статье верны для MS Visual Studio 2005, 2008. Однако основной интерес в том, что они не равны 4-м байтам.

Сначала приведем основной код, который и будет рассматриваться в данной статье

class Base
{
public:
void f()
{
std::cout << "Base";
}
};

Использовать методы этих классов можно следующим образом:

создаем указатель на метод класса Base

void(Base::* F) ();

присваиваем ему адрес метода класса Base

F = &Base::f;

Для нас самым важным в этом отрывке было то, что размер указателя F после присвоения равен 4-м байтам. В общем, необязательно даже что-то присваивать этому указателю. Если убрать последнюю строчку и просто вызвать sizeof(F), то результат тоже будет 4.

При добавлении еще одного класса

class Base1
{
public:
int m_base1;
void f()
{
std::cout << "Base1";
}
};

и наследовании от него ABase

class ABase : public Base, public Base1      ... 

указатель F объявленный вот так

void(ABase::* F) (); 

станет равен 8-ми байтам. Структура указателя будет такой:

--------------
|adress|index|
--------------
4 + 4 = 8 байт

где adress - адрес функции, index - смещение, необходимое для вычисления this для вызова соответствующей функции.

И наконец, доведем нашу ситуацию до абсурда. Если ABase унаследовать виртуально от обоих родителей

class ABase : virtual public Base, virtual public Base1      ...

то размер указателя F станет равным 12-ти байтам. Его структура станет такой

----------------------
|adress|index|vbIndex|
----------------------
4 + 4 + 4 = 12 байт

где adress - адрес функции, index - смещение, необходимое для вычисления this для вызова соответствующей функции, vbIndex - смещение, необходимое, для узнавания местарасположения таблицы виртуальных базовых классов.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 22  loading...
geolip   alexis112   dartz   rride   mexal   serj   Ljurka   asdqwe   vlad76   valyala   MichaelN   zipu4   ivan_4k   Glevera   zaff   sava_vodka   sanchez   Riddler   ITcrusader   Gurbych   Instand   ZorN