Размер структуры VC++
простите за чайниковский вопрос но ответ не смог найти в справке
столкнулся с проблемой(MS VC++6.0) - поля структуры расположены не байт к байту.
typedef struct TPDESCR
{
USHORT limit;
// USHORT invisible;
ULONG base;
} DFDESCR;
т.е. в описанном примере между полями limit и base содержится еще одно поле invisible размером 4-sizeof(limit).
как сделать, чтобы компилятор располагал данные без промежутков.
#pragma pack
Если проблема состоит только в том, чтобы убрать промежуток в данном конкретном случае (или аналогичных) то можно просто поменять поля местами:
[FONT=courier new]
typedef struct TPDESCR
{
ULONG base;
USHORT limit;
} DFDESCR;
[/FONT]
Промежутков между base и limit не будет, однако если создать массив таких структур промежуток возникнет между двумя соседними структурами.
#pragma pack (1) позволит полностью избавиться от всех дыр, но пользоваться ей без необходимости не стоит, так как она снижает быстродействие программы.
Если правильно понял вопрос, то в Project Settings страница С/C++, категория Code Generation, раздел Struct member alignment выбирай что душе угодно: выравнивания от 1 до 16 байт, но не уверен, что не это же делает pragma pack, а по поводу скорости - ??? неужели в release-компиляции тоже замедляется???
Цитата:
Если правильно понял вопрос, то в Project Settings страница С/C++, категория Code Generation, раздел Struct member alignment выбирай что душе угодно: выравнивания от 1 до 16 байт, но не уверен, что не это же делает pragma pack, а по поводу скорости - ??? неужели в release-компиляции тоже замедляется???
Settings->Code Generation->Struct member alignment делает тоже самое, что pragma pack, но преимущество последней в локальности изменений. То есть упаковать можно только одну структуру, а остальные оставить как есть. Настройки же Settings действуют как минимум на один файл, а то и на весь проект.
Скорость действительно замедляется, независимо от версии (Release или Debug). Дело в том, что для доступа к неправильно выравненным данным процессорам x86 требуются дополнительные циклы обращения в память.
typedef struct TPDESCR
{
USHORT limit;
ULONG base;
} DFDESCR
#pragma pack(pop)
только DFDDESCR и всё экземпляры TPDESCR не будут вырваниваться, а остальные данные будут выравниваться в соответствии с устновками проекта
Project->Settings->C/C++->Code Generation->Struct member alignment