Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Выравнивание sizeof


Автор: takedo 19.12.2005, 11:30
?Привожу вопрос. Кто сможет ответить?


Цитата
Вот какая проблема:
есть структура:
struct AA
{
unsigned int A0;
unsigned int A1;
unsigned int A2;
unsigned int A3;
unsigned int A4;
unsigned int A5;
BYTE num_jp_win;
};
итого 6(unsigned int) + 1 BYTE;

size0 = 6*sizeof(unsigned int) + sizeof(BYTE);
///size0 = 25;!!!!

size1 = sizeof(AA);
//size1 = 28;!!!

видимо sizeof выравнивет по четырем байтам. Но первый вариант неудобен. В чем прикол?? Пишу на Visual Studio 2003

Автор: Vyacheslav 19.12.2005, 14:42
sizeof показывает правильно, так как происходит выравнивание, установленое по умолчанию, а если тебя это не устраивает, то установи свое с помощью, например с помощью #pragma pack(1). И получишь свои 25

Автор: Coocky 19.12.2005, 14:47
takedo
Так, давайте по теме!
Я удалил все сообщения, не связаные с темой!! smile
Цитата(Vyacheslav @ 19.12.2005, 14:42)
sizeof показывает правильно, так как происходит выравнивание, установленое по умолчанию,


Цитата(takedo @ 19.12.2005, 11:30)
видимо sizeof выравнивет по четырем байтам

Аболютно правильно

Автор: Coocky 19.12.2005, 15:05
Из МСДН
Цитата

Когда Вы применяете sizeof оператор к структуре или названию типа союза, или к union type name, результат - число байтов в структуре или union type name, включая внутренний и таща дополнение. Этот размер может включить внутреннее и тянущееся дополнение, используемое, чтобы выровнять членов структуры или союза на границах памяти. Таким образом, результат, возможно, не соответствует размеру, вычисленному, складывая требования хранения индивидуальных членов.

Сорри за перевод smile

Автор: takedo 19.12.2005, 15:19
Coocky
Цитата
видимо sizeof выравнивет по четырем байтам


Аболютно правильно
- только для Win32. smile
Добавлено @ 15:21
Vyacheslav
Цитата
#pragma pack(1).

после этого вообще - то можно и обратно...
Добавлено @ 15:22
ладно, прделагаю тему закрыть, получил бы я ответ, хоть и не так подробно...

Автор: DeadSoul 19.12.2005, 23:13
Цитата(takedo @ 19.12.2005, 15:19)
Coocky
Цитата
видимо sizeof выравнивет по четырем байтам
Аболютно правильно
- только для Win32. 

А для не Win32:
- скомпилировался бы данный код(BYTE - не вляется С++ типом, это typedef)?
- какое выравнивание стоит на .... платформе?


Автор: takedo 20.12.2005, 10:06
по умолчанию, видимо выравнивание идет по 32 битам, в win65 по 65. А то, что BYTE это unsigned char - так это тут ни причем. есть ещё где-то настройки проекта студии, но через pragma как всегда удобнее.

Автор: bel_nikita 20.12.2005, 15:43
Про выравнивание читаем http://forum.vingrad.ru/index.php?showtopic=24425&hl=Выравнивание

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)