Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

sizeof на битовую структуру - C++

20.10.2012, 07:38. Просмотров 1179. Ответов 27
Метки нет (Все метки)

Данный код структуры :
C++
1
2
3
4
5
6
7
8
#pragma pack(push, 1)
 
struct FIELD
{ 
    unsigned x : BITS_COUNT; 
};
 
#pragma pack(pop)
воспринимается
C++
1
sizeof(FIELD);
как 4 байта, где
C++
1
#define BITS_COUNT 24
Вопрос : почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2012, 07:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос sizeof на битовую структуру (C++):

Sizeof(.) или constexpr size_t tmp = sizeof(.) - C++
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности? правильности?

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile) - C++
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до 600, 100 байтов как записать эту...

sizeof( char * ) & sizeof(char) - C++
Здравствуйте, не могу понять почему sizeof(char *) = 4 а sizeof(char) = 1. Ну с последним ясно , а вот с первым непойму... Может кто-то...

Преобразовать целые числа в битовую посследовательность - C++
Имеется в файле посследовательность целых чисел X1,X2,X3,X4 unsigned long int, расположенных построчно. Нужно преобразовать эти целые числа...

Как получить битовую маску вида 100.000 - C++
Как получить битовую маску вида 100...000? первая 1, все остальные нули. ПРобовал так, но почему-то не работает: DWORD mask = ~((~0) >>...

Цикл, принимающий с клавиатуры отдельные символы и накапливающий их в символьной переменной, каждый раз выполняя битовую операцию | - C++
Помогите пожалуйста чайнику с заданием Организовать цикл, который принимает с клавиатуры отдельные символы и накапливает их в символьной...

27
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.10.2012, 07:56 #2
Почитайте про выравнивание. В частности это настраивается в компиляторе. ( что то вроде #pragma pack() )
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 08:30  [ТС] #3
Toshkarik, ну так разве
C++
1
2
#pragma pack(push, 1)
#pragma pack(pop)
не хватает?
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
20.10.2012, 08:48 #4
А компилятор какой? Мой GCC даёт 3 и с #pargma pack и с __attribute__((__packed__)).
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 08:56  [ТС] #5
grizlik78, гениальный вопрос, но как посмотреть, какой компилятор? ><
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
20.10.2012, 08:58 #6
Используется какая-нибудь IDE? Какая? Я-то из командной строки компилирую, у меня такого вопроса нет
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 09:13  [ТС] #7
Visual studio 2008, хотя такая ошибка была при работае на 2005
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.10.2012, 09:28 #8
Цитата Сообщение от nexen Посмотреть сообщение
Вопрос : почему?
Ты задал тип unsigned int, который размером 4 байта. Из него в битовом поле используются 24 бита и 8 бит таскаются для выравнивания. Возможно, некоторые компиляторы и могут заменить тип unsigned на массив из трёх байт (как у грызлика), но это скорее медвежья услуга, которая ещё сильнее ударяет производительности по яй...
1
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
20.10.2012, 09:43 #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
но это скорее медвежья услуга, которая ещё сильнее ударяет производительности по яй...
Это было бы так, если бы компилятор самовольно занимался такой "упаковкой". Но тут программист осознанно включает "pack(1)", значит это ему зачем-то надо. Какое компилятору дело до производительности в данном случае?

Добавлено через 7 минут
В общем похоже, что MSVC не хочет/не умеет так делать. Что ж, в данном случае это целиком право компилятора. Если не устраивает, то надо либо придумать что-то другое, либо менять компилятор.
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.10.2012, 09:54 #10
Цитата Сообщение от grizlik78 Посмотреть сообщение
если бы компилятор самовольно занимался такой "упаковкой"
Ты ж в курсе, что такое упаковка? Она влияет на "расстояние" между разными объектами, но не влияет на размер объектов (то, что структура становится меньше, это побочный эффект выравнивания). 4 байта в три байта не вмещаются.
1
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
20.10.2012, 10:08 #11
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ты ж в курсе, что такое упаковка? Она влияет на "расстояние" между разными объектами, но не влияет на размер объектов (то, что структура становится меньше, это побочный эффект выравнивания).
Это всё компиляторо-специфичные расширения языка и нет смысла размышлять о том, как они могут работать, а как нет. Они работают так, как захотел разработчик.
Цитата Сообщение от Deviaphan Посмотреть сообщение
4 байта в три байта не вмещаются.
Один байт из этих четырёх не используется. Bit fields можно было бы рассматривать как возможность, при необходимости, уменьшить размер стандартного типа. А так "нужность" битовых полей находиться где-то около нуля...

Добавлено через 1 минуту
P.S. То, что GCC после упаковки даст 3 байта — я не ожидал. Но ничего плохого в этом не вижу.
2
Deviaphan
20.10.2012, 10:14
  #12

Не по теме:

Плюсанул за "нужность"

1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 10:27  [ТС] #13
Поспорьте ещё, вас читать интересно : )
0
Evg
Эксперт CАвтор FAQ
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,263
Записей в блоге: 30
20.10.2012, 10:53 #14
Цитата Сообщение от nexen Посмотреть сообщение
Вопрос : почему?
Ты можешь сделать битовое поле размером 1, у тебя будет ровно такой же результат. Потому что в реальности в структуре заводится подложка размером в sizeof(unsigned)
Чтение битового поля

Добавлено через 54 секунды
Цитата Сообщение от nexen Посмотреть сообщение
хотя такая ошибка была при работае на 2005
Это не ошибка. Компилятор работает в строгом соответствии со стандартом
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 11:03  [ТС] #15
Evg, спасибо. Раньше использовал просто x : BITS_COUNT, замечая, что при выводе бита при printf получается -1. Как-то раз увидел unsigned, вот и подумал, что это не unsigned int, а частный случай спецификатора, но для битов. Меня обманули ;( (ну точнее я не так понял, но ирония! Ирония!)
0
20.10.2012, 11:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2012, 11:03
Привет! Вот еще темы с ответами:

Sizeof - C++
int a = { 1, 2, 3, 4 },n = sizeof(a) / sizeof(a); Битый час разбираюсь с этой строкой,но понять не могу. Мы делим массив &quot;a&quot; на...

sizeof() - C++
Ребята,объясните пожалуйста для чего нужен sizeof()?А то в книге очень заумно написано...

sizeof - C++
Подскажите пожалуйста что делаю не так? в базовом классе gameElement, имеется матрица указателей на базовый класс: gameElement* arr; ...

Как char[] перевести в битовую маску long long(64 бита) и наоборот? - C++
Как char перевести в битовую маску long long(64 бита) и наоборот?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru