Размер классов при наследовании в С++

209
15 января 2020, 12:10

Если создать 2 таких класса:

class A
{
    double a;
    double b;
};
class B : public A
{
    char a;
};

и взять sizeof(B), то получим 24.

Eсли добавить в класс А поле типа int, то sizeof(B) будет так же равен 24 (такой же результат будет если в классе B заменить char на int)

class A
{
    double a;
    double b;
    int c;
};
class B : public A
{
    char a;
};

Почему в этих 2 случаях размер класса в байтах совпадает?

Компилятор gcc.

PS: с компилятором от студии выдает 32 байта

Answer 1

Вопрос не имеет никакого отношения к наследованию. В тех же реализациях вы получите тот же самый результат в случаях

struct A1
{
  double a;
  double b;
  char c;
};
struct A2
{
  double a;
  double b;
  int c;
  char d;
};

Оба класса будут иметь размер 24.

Требования выравнивания самого большого из использованных типов double (выравнивание на 8) диктуют, что размер класса с двумя полями double и "еще чем-то" должен быть как минимум 24. А остальные поля, с их более слабыми требованиями выравнивания, просто помещаются в лишние байты этого размера. Пока они помещаются, размер расти не будет.

Такой класс тоже будет иметь размер 24

struct A3
{
  double a;
  double b;
  char c1, c2, c3, c4, c5, c6, c7, c8;
};

Но если вы добавить в него еще хоть один char, то размер станет 32.

READ ALSO
libssh2 и Channel open failure (connect failed)

libssh2 и Channel open failure (connect failed)

При попытке создать канал как

171
std::vector указателей долго освобождает память

std::vector указателей долго освобождает память

Я считываю много данных из файла и заполняю ими вектор (про резервирование вектора знаю)После некоторых манипуляций с данными, я освобождаю...

191
регулярные выражения std::regex

регулярные выражения std::regex

Есть строка такого типа:

206