Байтовый расчет размера класса

0

Что такое sizeof(salesman)? Он говорит 48 байтов и нуждается в объяснении почему.

class customer {
  char c;
  double l;
  int k;
};

class salesman: private customer{
   int salno;
   char salname[20];
   protected :
    float salary;
 };
Теги:

2 ответа

4
Лучший ответ

Что ж, сложно догадаться о компиляторе.

Но customer может разумно потребовать 1 + 7 + 8 + 4 + 4 = 20 байт (7 и финал 4 - заполнение). Затем добавляется еще 4 + 20 + 4 = 28 для salesman, и кажется, что компилятор достаточно умен, чтобы отбросить последние 4 байта заполнения от customer при выполнении подкласса. Это 48!

Вышеизложенное предполагает, что sizeof (int) и sizeof (float) sizeof (double) 4, а sizeof (double) - 8.

  • 4
    Интересным фактом в этом случае будет то, что sizeof(customer) равен 24, а не 20, что показывает, что размер полного типа не обязательно равен размеру строгого подобъекта того же типа.
  • 2
    @IvayloStrandjev Требуется выравнивание не для char , а для double после char .
Показать ещё 6 комментариев
1

При следующих предположениях:

  • Размер char равен 1 байт

  • Размер int равен 4 байтам

  • Размер float - 4 байта

  • Размер double равен 8 байтам

  • Добавляется добавление, так что переменная размера N всегда будет находиться по адресу, делящемуся на N

Карта памяти экземпляра salesman такова:

Byte   0   : char   c;
Bytes  8-15: double l;
Bytes 16-19: int    k;
Bytes 20-23: int    salno;
Bytes 24-43: char   salname[20];
Bytes 44-47: float  salary;

Следовательно, общий размер экземпляра salesman составляет 48 байт.

Обратите внимание, однако, что предположения, приведенные выше, не обязательно верны для каждого компилятора.

  • 0
    Договорились с картой памяти, отлично.
  • 0
    Нет проблем, пожалуйста (но почему вы удалили «принять»?).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню