Pages

Saturday, August 29, 2009

Еще о размерах объектов

Вот простая програмка:
#include <iostream>
using namespace std;

class A {};

class B
{
A a[2];
A b;
};

class C
{
A a;
A* b;
};

class D : public A
{
A* b;
};

int main()
{
A a;
B b;
C c;
D d;
cout << "sizeof A is " << sizeof(a) << endl;
cout << "sizeof B is " << sizeof(b) << endl;
cout << "sizeof C is " << sizeof(c) << endl;
cout << "sizeof D is " << sizeof(d) << endl;

return 0;
}

Вот что увидим на экране:

Все 4 объекта имеют "странный" размер?
Объект типа A имеет размер 1 байт. Класс A "пустой" - ни одного члена. Если бы разработчики стандарта допустили нулевой размер, то абсолютная чепуха вышла бы с классом B - тут объявлены два члена типа A. Если бы A имел размер 0, то и размер класса B тоже был бы 0. И что делать с массивом A a[2]? Как найти второй элемент в этом массиве? Какой у него размер? Легче договориться, что размер пустого класса равен 1 байту и все проблемы снимаются.
А класс B имеет размер 3. Казалось бы, что это объяснимо - класс B содержит 3 объекта типа A, а их размер 1, значит, B имеет размер 3 байта.
Но тогда почему объект типа C имеет размер 8?
Выравнивание - alignement. Добавились 3 байта (padding), чтобы размер объекта был кратным 8.
А вот объект класса D имеет размер 4. То есть память "ушла" только на поинтер. Наследование "съэкономило" 4 байта.

No comments:

Post a Comment