struct screen_fullheader{ WORD h; //+2 WORD m; //+2 long sz; //+4 WORD s; //+2 long width; //+4 long height; //+4 WORD bitcount; //+2 }sfhead; // = 20 байт почему в MSVC6.0 sizeof(sfhead) дает 24????
Уверен что 24? Тогда это странно. Либо 28 должно быть, а если 24 значит в структуре 6 полей а не 7. Выравнивание по умолчанию=4 байтам
Сам знаю что страно, уже несколько часов ломаю голову и не могу понять в чем дело... откуда-то берутся 4 лишних байта.. но не ясно откуда..
причем sizeof(sfhead.h)+sizeof(sfhead.m)+sizeof(sfhead.sz)+sizeof(sfhead.s)+sizeof(sfhead.width)+sizeof(sfhead.height)+sizeof(sfhead.bitcount) дает 20!!!!
Всему виной выравнивание. Скажем структура Код (Text): struct _XXX { char c1; char c2; } XXX; И sizeof(XXX)=8, а не 2 как можно было бы подумать. По умолчанию align=4, если тебе важно чтобы выравнивание было равно 1 (например, в случае написания перехватчика), то используй следующее: Код (Text): #pragma pack (push, x) // где x=желаемое выравнивание, разумеется должно быть степенью двойки ... // описания твоих структур #pragma pack (pop) // восстанавливает выравнивание по умолчанию Таким образов ставь выравнивание=1 и у тебя размер всей структуры будет равен сумме размеров входящих в нее полей.
Да, вспомнил, еще модешь использовать следующий код: Код (Text): typedef struct __declspec(align(x)) _XXX { ... } XXX; Где x - выравнивание. Может быть такой способ будет тебе удобней.
Сталкивался с подобной проблемой, долго думал в чем дело и путем отладки наталкнулся на выравнивание - веселая шутка характерна как для VS так для DDK.
Код (Text): #include <stdio.h> typedef struct _XXX { char c1; char c2; } XXX; int main(){ printf("%d", sizeof(XXX)); return 0; } MSVC 7, gcc 3.4 выводят 2. выравнивание происходит по границе равной размеру поля. то есть Код (Text): struct { short a; int b; } b будет располагаться по смещению +4. Код (Text): struct { short a; short b; } А так по смещению +2.