О выравнивании в структурах в С\С++

Тема в разделе "WASM.WIN32", создана пользователем LuckyDevil, 14 сен 2005.

  1. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Всем доброго!!!

    Очередной раз с вопросом, звучит он глуповато, и все же.

    вот структура:
    Код (Text):
    1.  
    2. typedef struct _HOOK_EXTENSION {
    3.     FILE_SYSTEM_TYPE Type;
    4.     PDEVICE_OBJECT   FileSystem;
    5.     unsigned         LogicalDrive;
    6.     BOOLEAN          Hooked;
    7.     PFILE_FS_ATTRIBUTE_INFORMATION FsAttributes;
    8. } HOOK_EXTENSION, *PHOOK_EXTENSION;        
    9.  


    на первый взгляд все просто и понятно, но ...

    так как мой основной язык программирования это Дельфи, некоторые моменты мне не понятны, а именно.

    Когда я пытаюсь узнать размер структуры, я получаю 20 байт, просматривая размер каждого поля, я получаю следующее 1 поле 4байта; 2-4; 3-4; 3-1; 4-4;

    В итоге размер структуры 21, ладно иду дальше, пытаюсь посотреть смещения полей в структуре FIELD_OFFSET, получаю теже данные.

    Объясните, как это может быть???

    для себя я делаю вывод следующий, поле Type на самом деле занимает 2 байта, а не 4, и структуру выравнивают на 4. Если я прав, то как система определяет это?
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Выравнивание полей структуры задаётся опцией компилятора.
     
  3. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    AsmGuru62, это все понятно.

    Я про то как в процессе исполнения кода, я получаю нужные данные а не мусор?

    <font color="red]для себя я делаю вывод следующий, поле Type на самом деле занимает 2 байта, а не 4, и структуру выравнивают на 4.</font><!--color-->

    но ведь FIELD_OFFSET(HOOK_EXTENSION,FileSystem) дает смещение с 4-го байта, когда долже показать с 2-го.
     
  4. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Вообщем выравниваение структуры идет на 4, а как там уже система с ней работает ))))...

    Проверил в дельфи, тоже самое, отсюда вывод, знать так надо ))), тему можно закрыть.
     
  5. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    это как же так - то

    4+4+4+4+1 ==21 ?

    точно не 17 ?

    :derisive:
     
  6. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    staier, )))))))))))))))))))))

    как всегда, проявил свою лучшую черту, невнимательность ))).

    ведь точно 17 ))))
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Выравнивание структур задается директивой pragma pack



    Если перед описанием структуры поставить #pragma pack(push, 1), то они выравнивается на 1 байт. #pragma pack (pop) восстанавливает прежнее выравнивание.
     
  8. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    >Когда я пытаюсь узнать размер структуры, я получаю 20 бай



    А ещё можно так:



    HOOK_EXTENSION he;



    printf("%d", sizeof(he.Type)+sizeof(he.FileSysystem)+... );
     
  9. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    общее правило (для VC):

    struct_member_offset кратно min(struct_member_size, pragma_pack_value)