баг или ...?

Тема в разделе "WASM.BEGINNERS", создана пользователем valix7, 10 дек 2006.

  1. valix7

    valix7 New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    143
    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????
     
  2. cc

    cc New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    34
    Уверен что 24? Тогда это странно. Либо 28 должно быть, а если 24 значит в структуре 6 полей а не 7. Выравнивание по умолчанию=4 байтам
     
  3. valix7

    valix7 New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    143
    Сам знаю что страно, уже несколько часов ломаю голову и не могу понять в чем дело... откуда-то берутся 4 лишних байта.. но не ясно откуда..
     
  4. valix7

    valix7 New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    143
    причем sizeof(sfhead.h)+sizeof(sfhead.m)+sizeof(sfhead.sz)+sizeof(sfhead.s)+sizeof(sfhead.width)+sizeof(sfhead.height)+sizeof(sfhead.bitcount) дает 20!!!!
     
  5. cc

    cc New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    34
    Всему виной выравнивание. Скажем структура

    Код (Text):
    1. struct _XXX
    2. {
    3.      char c1;
    4.      char c2;
    5. } XXX;
    И sizeof(XXX)=8, а не 2 как можно было бы подумать.
    По умолчанию align=4, если тебе важно чтобы выравнивание было равно 1 (например, в случае написания перехватчика), то используй следующее:

    Код (Text):
    1. #pragma pack (push, x) // где x=желаемое выравнивание, разумеется должно быть степенью двойки
    2. ... // описания твоих структур
    3. #pragma pack (pop) // восстанавливает выравнивание по умолчанию
    Таким образов ставь выравнивание=1 и у тебя размер всей структуры будет равен сумме размеров входящих в нее полей.
     
  6. valix7

    valix7 New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2006
    Сообщения:
    143
    спасибо!
     
  7. cc

    cc New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    34
    Да, вспомнил, еще модешь использовать следующий код:

    Код (Text):
    1. typedef struct __declspec(align(x)) _XXX
    2. {
    3.    ...
    4. } XXX;
    Где x - выравнивание.

    Может быть такой способ будет тебе удобней.
     
  8. Guest

    Guest Guest

    Публикаций:
    0
    Сталкивался с подобной проблемой, долго думал в чем дело и путем отладки наталкнулся на выравнивание - веселая шутка характерна как для VS так для DDK.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. typedef struct _XXX
    4. {
    5.      char c1;
    6.      char c2;
    7. } XXX;
    8.  
    9. int main(){
    10.     printf("%d", sizeof(XXX));
    11.     return 0;
    12. }
    MSVC 7, gcc 3.4 выводят 2.
    выравнивание происходит по границе равной размеру поля.
    то есть
    Код (Text):
    1. struct {
    2.  short a;
    3.  int b;
    4. }
    b будет располагаться по смещению +4.
    Код (Text):
    1. struct {
    2.  short a;
    3.  short b;
    4. }
    А так по смещению +2.