#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;
}
Вот что увидим на экране:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDpUsT5gBrhZ1J3Txw8JUAoroU8JfJyhgPuRLdE6Ar8Z0Ae910fytTK4kDUSTIgJxpzibG2qBJjQN333qVMWTl1S-78TugBmwRwf3fsDQTabn3vM5AJyoTv9ynJZxakNHovpUBuoDwsCo/s400/size+of+objects.png)
Все 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