Выравнивание данных и проблема наследования - PullRequest
0 голосов
/ 08 ноября 2010

Учитывая эти структуры на 64 битах:

struct base
{
  long a;
};

struct derived : public base
{
  long b;
  char c;
};

Я получаю размер 24 и предупреждение о заполнении, но я не понимаю, почему.Для меня данные с этим типом наследования выровнены следующим образом:

a
b
c

Таким образом, a выровнен по 8, b тоже, а c - символ и выровнен по 1. Так в чем здесь проблема, почемуразмер 24?

Ответы [ 2 ]

8 голосов
/ 08 ноября 2010

Размер равен 24, поэтому при создании массива struct derived второй элемент массива будет иметь 8-байтовое выравнивание для base::a.

1 голос
/ 08 ноября 2010

Иногда компилятор решает использовать размер слова для всех элементов, чтобы повысить скорость работы. В GCC, например, вы можете принудительно выравнивать, используя

__attribute__((packed))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...