Размер объекта класса

107
30 января 2022, 11:40

Почему объект класса B=16, а объект A=4? Как влияет виртуальная функция на размер?

class A
{
    void funcA();
    int x;
};
class B
{
    virtual void funcB();
    int y;
};
Answer 1

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

Судя по результатам, вы компилировали 64-разрядное приложение :)

Update

Почему 16, а не 12... Итак, VC++, 64-разрадное приложение:

#include <iostream>
#include <iomanip>
using namespace std;
class A
{
    void funcA();
    int x;
};
class B
{
    virtual void funcB();
    int y;
};
#pragma pack(1)
class C
{
    virtual void funcB();
    int y;
};

int main(int argc, const char * argv[])
{
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
    cout << sizeof(C) << endl;
}

Получаем:

4
16
12
Answer 2

Контекстное окружение должна уметь определять какая именно реализация вызывается(это реализация метода класса В или какого то наследника?). Для этого создается таблица виртуальных функций, и каждый обьект имеет неявный указатель на эту таблицу. В стандартах C++ нет четкого определения как должна реализовываться динамическая координация, но компиляторы зачастую используют некоторые вариации одной и той же базовой модели: Конкретно экземпляры класса В будут иметь:

  • указатель на виртуальную функцию(vptr)-64 битового приложения это 8 байт

  • тип int _ выравнивается по размеру vptr _ тоже 8 байт.

Итог 16 байт

READ ALSO
Псевдоним шаблона в самом шаблоне класса

Псевдоним шаблона в самом шаблоне класса

Рассмотрим класс итератора для массивов stdext::checked_array_iterator, который определен в заголовочном файле <iterator>Экземпляр класса можно использовать...

90
Конструктор копирования для QList&lt;T&gt;

Конструктор копирования для QList<T>

У меня есть объект который иногда мне нужно будет скопировать в другойесли быть точнее, то у меня в классе client_t есть 3 одинаковых объекта,...

74
Чем плоха публичность переменных в ООП?

Чем плоха публичность переменных в ООП?

Я работаю на C#, но полагаю, это касается любого языка использующий объектно - ориентированную парадигму

161
Событие на нарисованный объект c#

Событие на нарисованный объект c#

Есть класс Circle, который рисует окружности заданного размераЯ попытался сделать событие на клик мыши, которое показывало бы информацию по данному...

87