Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Размер структуры VC++

2.2K
04 марта 2003 года
anbezr
11 / / 28.01.2003
Привет!
простите за чайниковский вопрос но ответ не смог найти в справке
столкнулся с проблемой(MS VC++6.0) - поля структуры расположены не байт к байту.
typedef struct TPDESCR
{
USHORT limit;
// USHORT invisible;
ULONG base;
} DFDESCR;
т.е. в описанном примере между полями limit и base содержится еще одно поле invisible размером 4-sizeof(limit).
как сделать, чтобы компилятор располагал данные без промежутков.
2.2K
05 марта 2003 года
anbezr
11 / / 28.01.2003
#pragma pack
2.0K
07 марта 2003 года
segev
67 / / 19.01.2003
anbezr
Если проблема состоит только в том, чтобы убрать промежуток в данном конкретном случае (или аналогичных) то можно просто поменять поля местами:
[FONT=courier new]
typedef struct TPDESCR
{
ULONG base;
USHORT limit;
} DFDESCR;
[/FONT]

Промежутков между base и limit не будет, однако если создать массив таких структур промежуток возникнет между двумя соседними структурами.
#pragma pack (1) позволит полностью избавиться от всех дыр, но пользоваться ей без необходимости не стоит, так как она снижает быстродействие программы.
356
09 марта 2003 года
molnij
159 / / 20.06.2000
Если правильно понял вопрос, то в Project Settings страница С/C++, категория Code Generation, раздел Struct member alignment выбирай что душе угодно: выравнивания от 1 до 16 байт, но не уверен, что не это же делает pragma pack, а по поводу скорости - ??? неужели в release-компиляции тоже замедляется???
2.0K
10 марта 2003 года
segev
67 / / 19.01.2003
molnij
Цитата:

Если правильно понял вопрос, то в 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 требуются дополнительные циклы обращения в память.

3.2K
26 марта 2003 года
bryk
20 / / 26.03.2003
#pragma pack(push, 1)
typedef struct TPDESCR
{
USHORT limit;
ULONG base;
} DFDESCR
#pragma pack(pop)

только DFDDESCR и всё экземпляры TPDESCR не будут вырваниваться, а остальные данные будут выравниваться в соответствии с устновками проекта
Project->Settings->C/C++->Code Generation->Struct member alignment
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог