Форум программистов, компьютерный форум CyberForum.ru

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

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

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

20.10.2012, 07:38. Просмотров 1089. Ответов 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
Вопрос : почему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.10.2012, 07:56     sizeof на битовую структуру #2
Почитайте про выравнивание. В частности это настраивается в компиляторе. ( что то вроде #pragma pack() )
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 08:30  [ТС]     sizeof на битовую структуру #3
Toshkarik, ну так разве
C++
1
2
#pragma pack(push, 1)
#pragma pack(pop)
не хватает?
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
20.10.2012, 08:48     sizeof на битовую структуру #4
А компилятор какой? Мой GCC даёт 3 и с #pargma pack и с __attribute__((__packed__)).
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 08:56  [ТС]     sizeof на битовую структуру #5
grizlik78, гениальный вопрос, но как посмотреть, какой компилятор? ><
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
20.10.2012, 08:58     sizeof на битовую структуру #6
Используется какая-нибудь IDE? Какая? Я-то из командной строки компилирую, у меня такого вопроса нет
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 09:13  [ТС]     sizeof на битовую структуру #7
Visual studio 2008, хотя такая ошибка была при работае на 2005
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.10.2012, 09:28     sizeof на битовую структуру #8
Цитата Сообщение от nexen Посмотреть сообщение
Вопрос : почему?
Ты задал тип unsigned int, который размером 4 байта. Из него в битовом поле используются 24 бита и 8 бит таскаются для выравнивания. Возможно, некоторые компиляторы и могут заменить тип unsigned на массив из трёх байт (как у грызлика), но это скорее медвежья услуга, которая ещё сильнее ударяет производительности по яй...
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
20.10.2012, 09:43     sizeof на битовую структуру #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
но это скорее медвежья услуга, которая ещё сильнее ударяет производительности по яй...
Это было бы так, если бы компилятор самовольно занимался такой "упаковкой". Но тут программист осознанно включает "pack(1)", значит это ему зачем-то надо. Какое компилятору дело до производительности в данном случае?

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

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

Не по теме:

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

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

Добавлено через 54 секунды
Цитата Сообщение от nexen Посмотреть сообщение
хотя такая ошибка была при работае на 2005
Это не ошибка. Компилятор работает в строгом соответствии со стандартом
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 11:03  [ТС]     sizeof на битовую структуру #15
Evg, спасибо. Раньше использовал просто x : BITS_COUNT, замечая, что при выводе бита при printf получается -1. Как-то раз увидел unsigned, вот и подумал, что это не unsigned int, а частный случай спецификатора, но для битов. Меня обманули ;( (ну точнее я не так понял, но ирония! Ирония!)
Evg
Эксперт CАвтор FAQ
17392 / 5630 / 352
Регистрация: 30.03.2009
Сообщений: 15,416
Записей в блоге: 26
20.10.2012, 11:19     sizeof на битовую структуру #16
Цитата Сообщение от nexen Посмотреть сообщение
Раньше использовал просто x : BITS_COUNT, замечая, что при выводе бита при printf получается -1. Как-то раз увидел unsigned, вот и подумал, что это не unsigned int, а частный случай спецификатора, но для битов
Если честно, нифига не понял
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
20.10.2012, 11:36     sizeof на битовую структуру #17
Битовые поля полезны в случае, если в коде есть операции над отдельными битами. Это лучше чем каждый бит или несколько вытаскивать по маске и выравнивать оператором сдвига.

Ну и, выравнивание и упаковка применяются к байтам, а не к отдельным битам, так что размеры не кратные байту ты все равно не получишь.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 12:24  [ТС]     sizeof на битовую структуру #18
Evg, имел ввиду, что подобная вещь:
C++
1
2
3
4
5
6
7
struct X
{
x : 1;
};
...
X x;
printf("%d", x.x);
выдает -1. Как и cout. Что логично.
Evg
Эксперт CАвтор FAQ
17392 / 5630 / 352
Регистрация: 30.03.2009
Сообщений: 15,416
Записей в блоге: 26
20.10.2012, 13:02     sizeof на битовую структуру #19
В этом случае у тебя битовое поле имеет тип int - одно из черезжопий языка Си, когда описание типа можно пропускать и оно по дефолту становится int'ом. При чтении или любом другом использовании битовое поле расширяется до полноценного типа (в данном случае делается знаковое расширение до int'а).

В этом месте есть некоторая опасность: в языках Си и Си++ имеет место быть немного различное поведение. См. пример 2 по ссылке http://www.cyberforum.ru/cpp-experts...tml#post889587
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2012, 13:26     sizeof на битовую структуру
Еще ссылки по теме:

sizeof (double) C++
sizeof() C++
Sizeof C++
C++ Fwrite (buffer , sizeof(char), sizeof(buffer), pFile)
C++ Sizeof(.) или constexpr size_t tmp = sizeof(.)

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

Или воспользуйтесь поиском по форуму:
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
20.10.2012, 13:26  [ТС]     sizeof на битовую структуру #20
Evg, никогда не знал о таком О___о спасибо!
Yandex
Объявления
20.10.2012, 13:26     sizeof на битовую структуру
Ответ Создать тему
Опции темы

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