sizeof (): размер класса не совпадает с размером его членов вместе? - PullRequest
1 голос
/ 09 октября 2010

Прежде всего, в моей системе удерживаются следующие значения: sizeof(char) == 1 и sizeof(char*) == 4.Проще говоря, когда мы вычисляем общий размер класса ниже:

class SampleClass { char c; char* c_ptr; };

, мы можем сказать, что sizeof(SampleClass) = 5.ОДНАКО, когда мы компилируем код, мы легко видим, что sizeof(SampleClass) = 8.

Итак, вопрос в том, где проблема с вычислениями?: S

  • Язык: C ++
  • Компилятор: GCC 4.4.0
  • ОС: Tinycore

Ответы [ 2 ]

4 голосов
/ 09 октября 2010

Компиляторы обычно добавляют отступы к структурам, чтобы выровнять их по границам слов (поскольку доступ к расположенным по словам словам местам требует меньше обращений к памяти и, следовательно, быстрее).

Таким образом, даже если char занимает только 1 байт, c_ptr смещается к следующей 4-байтовой границе, следовательно, результат 8 байтов.

3 голосов
/ 09 октября 2010

Это вызвано заполнением.
Компилятор добавляет отступы:

  • чтобы сделать доступ к членам максимально быстрым
  • также для создания массивов пакета объектов для обеспечения эффективного доступа к элементам.

Таким образом, объекты, имеющие размер 1, могут быть выровнены по границам в 1 байт и при этом легко / эффективно считываться. В то время как объекты размером 4 должны быть выровнены по 4-байтовым границам (в зависимости от вашего компилятора) (технически вы можете выровнять по 1-байтовым границам, но это означает, что вам обычно требуется несколько инструкций для извлечения и объединения, и таким образом это более эффективно записывать до 4 байтовых границ)).

Таким образом, для оптимального выравнивания конструкций лучше всего упорядочить элементы по размеру (сначала по величине). Это даст вам оптимальную стратегию упаковки в большинстве нормальных ситуаций.

Это не остановит ваш объект размером восемь байт.
В качестве компилятора также учитывается, что ваш класс может использоваться в массивах. Таким образом, каждый элемент в массиве должен быть выровнен так, чтобы самый большой элемент каждого элемента был выровнен соответствующим образом.

...