Здравствуйте, Magic, Вы писали:
M>Почему так? Может это зависит от выравнивания?
Да, дело именно в выравнивании.
M>Тогда как выравнивать?
Сначала ответь: почему тебя не устраивает текущее положение?
Но возвращает — 12. M>Почему так? Может это зависит от выравнивания? Тогда как выравнивать?
Я уже подробно отвечал на этот вопрос
Сообщение 395496 от 29.09.2003
Заголовок: Где почитать правила выравнивания структур
Здравствуйте, Magic, Вы писали:
M>Почему sizeof() возвращает значения, которые кажутся не верными? <...> M>Тогда в этом случае он должен возвращать 6, казалось бы: M>
Но возвращает — 12. M>Почему так? Может это зависит от выравнивания? Тогда как выравнивать?
по умолчанию в MSVC выравнивание по 8, поэтому 12 получается, т.к. указатель требует выравнивания по 4 байта (иначе произойдет ошибка в системной шине, в линуксе SIGBUS), он его выравнивает с 8-го байта, вот тебе и 12 байт.
Должнобыть 6:
Но возвращает — 12. M>>>Почему так? Может это зависит от выравнивания? Тогда как выравнивать? ВН>>Может у тебя строчки (1) и (2) местами поменяны?
M>А от этого что-то зависит???
Многое Если принять за постулат, что по умолчанию данные выравнены по границе 4 байта, то тогда:
F>>>Итого 12 байт.
M>>А если мы строчку 2) поместим в конец описания, то, разве, не такой же результат получим?
F>Не тот-же, как это ни странно. Должно получиться 8 байт. Почему? Подумайте.
Наверно поттому, что если бы строка 3) стояла вместе с 1), то полселе выравнивания на 4 байта потребовалось бы добавить только два байта после 1)+3) Так?
M>Наверно поттому, что если бы строка 3) стояла вместе с 1),
Тогда они занимали бы 2 байта, так как у каждого члена типа char выравнивание 1.
то полселе выравнивания на 4 байта потребовалось бы добавить только два байта
после 1)+3) Так?
Да, так, потому что у следующего члена-указателя выравнивание 4, а 2 + 2 == 4
Короче, есть ситуации, когда порядок расположения членов, и даже помещение их в базовый или производный класс влияет на размер объекта.
Of course, the code must be complete enough to compile and link.
При выравнивании 4 — скорее 8, чем 6: в массивах объекты размещаются непрерывно, соответственно, компилятор должен "шаманить" с самой структурой, чтобы потом ее безболезненно можно было поместить в массив.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, Ovl, Вы писали:
Ovl>>значит если сделать так, то структура всегда будет занимать 6 байт (если выравнивание <= 4)?
Ovl>>
ПК>При выравнивании 4 — скорее 8, чем 6: в массивах объекты размещаются непрерывно, соответственно, компилятор должен "шаманить" с самой структурой, чтобы потом ее безболезненно можно было поместить в массив.
Почему скорее? Именно так и будет. sizeof (T) всегда кратен alignof (T) -- именно из-за массивов. При необходимости добавляется паддинг в конце.