выравнивание битовых полей в структуре
От: Alirp Россия  
Дата: 04.05.08 04:54
Оценка:
Всем привет.
Я столкнулся со следующей проблемой.
Есть структура:

#pragma pack( push, 1 )

struct _mass_1 {
unsigned char data1 :6;
unsigned char data2 :2;
unsigned char data3 :5;
unsigned char data4 :3;
unsigned char data5 :5;
unsigned char data6 :5;
unsigned char data7 :5;
unsigned char data8 :1;
};

#pragma pack( pop )

При вызове sizeof (_mass_1); возвращается 5, хотя должно быть 4.

До этого писал под Linux:
#pragma pack( 1 )
та же структура
#pragma pack( )

sizeof возвращает 4, как и должно быть.
Подскажите пожалуйста если кто знает, как сделать выравнивание битовых полей структуры в Windows в данном случае,
программа написана в C++Builder 6 .

Заранее всем спасибо.
Re: выравнивание битовых полей в структуре
От: Alex34 Израиль  
Дата: 04.05.08 05:10
Оценка:
Здравствуйте, Alirp, Вы писали:

A>Всем привет.

A>Я столкнулся со следующей проблемой.
A>Есть структура:

A>#pragma pack( push, 1 )


A>struct _mass_1 {

A> unsigned char data1 :6;
A> unsigned char data2 :2;
A> unsigned char data3 :5;
A> unsigned char data4 :3;
A> unsigned char data5 :5;
A> unsigned char data6 :5;
A> unsigned char data7 :5;
A> unsigned char data8 :1;
A>};

A>#pragma pack( pop )


A>При вызове sizeof (_mass_1); возвращается 5, хотя должно быть 4.


А с чего ты взял , что должно быть 4 ? Только изза суммы используемых битов?
#pragma pack — может гарантировать что все биты будут идти подряд , без окон.
А каждый компайлер сам решит сколько решит выделить для хранения переменной типа структуры .
На личном опыте сталкивался с данной проблеммой. А решение зависит от того , в каком контексте
или в какой задаче ты это используешь?
Re[2]: выравнивание битовых полей в структуре
От: Alirp Россия  
Дата: 04.05.08 05:19
Оценка:
Здравствуйте, Alex34, Вы писали:

A>А с чего ты взял , что должно быть 4 ? Только изза суммы используемых битов?

A>#pragma pack — может гарантировать что все биты будут идти подряд , без окон.
A>А каждый компайлер сам решит сколько решит выделить для хранения переменной типа структуры .
A>На личном опыте сталкивался с данной проблеммой. А решение зависит от того , в каком контексте
A>или в какой задаче ты это используешь?

В моем случае я использую битовые структуры следующим образом:

unsigned char *send_buf;
send_buf = new гтышптув char [MAX_LEN_BUF];
_mass_1 *s = (_mass_1 *) &send_buf[0];

Причем может идти подряд ни одна битовая структура, поэтому важно чтобы данные шли подряд
и соответствовали размеру.
Re: выравнивание битовых полей в структуре
От: remark Россия http://www.1024cores.net/
Дата: 04.05.08 06:28
Оценка: 3 (2)
Здравствуйте, Alirp, Вы писали:

A>struct _mass_1 {

A> unsigned char data1 :6;
A> unsigned char data2 :2;
A> unsigned char data3 :5;
A> unsigned char data4 :3;
A> unsigned char data5 :5;
A> unsigned char data6 :5;

A> unsigned char data7 :5;
A> unsigned char data8 :1;
A>};

A>При вызове sizeof (_mass_1); возвращается 5, хотя должно быть 4.


Я думаю, что проблема в выделенном. Под эти 2 поля выделяется 2 целиковых байта.

Сделай аналогичную структуру с unsigned. Тогда точно будет 4 байта.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: выравнивание битовых полей в структуре
От: Alirp Россия  
Дата: 04.05.08 06:52
Оценка:
Здравствуйте, remark, Вы писали:

A>>struct _mass_1 {

A>> unsigned char data1 :6;
A>> unsigned char data2 :2;
A>> unsigned char data3 :5;
A>> unsigned char data4 :3;
R>A> unsigned char data5 :5;
A>> unsigned char data6 :5;

A>> unsigned char data7 :5;
A>> unsigned char data8 :1;
A>>};

R>Я думаю, что проблема в выделенном. Под эти 2 поля выделяется 2 целиковых байта.


R>Сделай аналогичную структуру с unsigned. Тогда точно будет 4 байта.


Спасибо, вроде бы все заработало, надо проверить побитно, а размер действительно стал 4 байта.
Re[3]: выравнивание битовых полей в структуре
От: Alex34 Израиль  
Дата: 04.05.08 11:42
Оценка:
Здравствуйте, Alirp, Вы писали:

A>Здравствуйте, Alex34, Вы писали:


A>В моем случае я использую битовые структуры следующим образом:


A>unsigned char *send_buf;

A>send_buf = new гтышптув char [MAX_LEN_BUF];
A>_mass_1 *s = (_mass_1 *) &send_buf[0];

A>Причем может идти подряд ни одна битовая структура, поэтому важно чтобы данные шли подряд

A>и соответствовали размеру.

судя по всему речь идет у тебя об отображении буффера канала связи на структуру данных в памяти , которая по этому каналу передаються.
Мы раньше тоже так делали , но после некоторых проблем поменяли концепцию.
Во первых проблема , которую ты упомянул. Нельзя надеятся на компилятор , как он разместит данные в памяти. Во вторых всевозможные проблемы с Big/Little Endian и т.д.

Мы создали фреймворк который производит сериализацию/десериализацию данных в буффер сообщения учитывая позицию каждого элемента в битах и длину этого елемента в битах. То есть буффер сообщения СТРОИТСЯ , а не ОТОБРАЖАЕТСЯ на память.

Все это написал , надеясь что понял твою проблему.
Re[4]: выравнивание битовых полей в структуре
От: Alirp Россия  
Дата: 04.05.08 12:22
Оценка:
Здравствуйте, Alex34, Вы писали:

A>Здравствуйте, Alirp, Вы писали:


A>>Здравствуйте, Alex34, Вы писали:


A>>В моем случае я использую битовые структуры следующим образом:


A>>unsigned char *send_buf;

A>>send_buf = new гтышптув char [MAX_LEN_BUF];
A>>_mass_1 *s = (_mass_1 *) &send_buf[0];

A>>Причем может идти подряд ни одна битовая структура, поэтому важно чтобы данные шли подряд

A>>и соответствовали размеру.

A>судя по всему речь идет у тебя об отображении буффера канала связи на структуру данных в памяти , которая по этому каналу передаються.

A>Мы раньше тоже так делали , но после некоторых проблем поменяли концепцию.
A>Во первых проблема , которую ты упомянул. Нельзя надеятся на компилятор , как он разместит данные в памяти. Во вторых всевозможные проблемы с Big/Little Endian и т.д.

A>Мы создали фреймворк который производит сериализацию/десериализацию данных в буффер сообщения учитывая позицию каждого элемента в битах и длину этого елемента в битах. То есть буффер сообщения СТРОИТСЯ , а не ОТОБРАЖАЕТСЯ на память.


A>Все это написал , надеясь что понял твою проблему.


Спасибо за совет, мне уже подсказали как решить проблему в моем случае. Я тоже стараюсь
не использовать битовые поля для создания буфера, просто в данном случае программа является
иммитатором, и не требует переносимости, а так как надо написать в кротчайший срок решил использовать
битовые поля, сейчас все работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.