Что на каких компиллерах получается и что впринципе должно быть? Код (Text): class A { public: typedef char bit:1; bit a1, a2, a3, a4, a5, a6, a7, a8; }; sizeof(A) ???
Лучше пользоватся union-ами typedef struct _byte_bits { unsigned int bit0 : 1; unsigned int bit1 : 1; unsigned int bit2 : 1; unsigned int bit3 : 1; unsigned int bit4 : 1; unsigned int bit5 : 1; unsigned int bit6 : 1; unsigned int bit7 : 1; }Byte,*PByte; union ByteFlags { Byte bbyte; unsigned char cbyte; };
странная конструкция, впервые вижу. У меня VC++ позволяет такие typedef-ы внутри классов. В твоем примере каждый "бит" имеет размер 1 байт, т.е. это не битовое поле. Comeau C++ (лучший по части соблюдения стандарта) вообще такое не компилит.
_DEN_ Если оформить по стандарту, то занимать это будет 1 байт (sizeof(A) == 1). Я бы в первую очередь поменял class на struct. Паковка тут не имеет значения абсолютно (ну, за исключением 7-битных машин, коих уже нет). Ation Во-первых, почему в вашем примере unsigned int совмещается с char? Во-вторых, чем этот union лучше обычного bitfield'а? А bitfield'ами пользоваться действительно не рекомендуется, т.к. получается больше кода, возникает зависимость от платформы. В общем случае, его лучше заменить на логические операции с масками. Peshuha Если создать массив из 10 таких структур, он будет занимать больше 10 байт? ... Поэтому, в данном случае (все биты помещаются в 1 байт), паковка не имеет значения.
Quantum Насколько мне известно char везде занимает ровно адын байт Структура Byte содержит ровно 8 полей (по биту каждый) А инт или чар для одного бита не имеет значения. А насчет того что лучше, действительно фраза несколько неуместна ) Просто ИМХО в юнионе проще работать.
Мужики, не надо меня наставлять как "надо" писать, а как "не надо" писать ) Меня такие вопросы интересуют лишь с точки зрения "тонкостей" стандарта. А вопрос возник потому что на моей 7.1 картина такая Код (Text): class A { public: typedef char bit:1; bit a1, a2, a3, a4, a5, a6, a7, a8; }; class B { public: char a1:1, a2:1, a3:1, a4:1, a5:1, a6:1, a7:1, a8:1; }; sizeof(A) = 8 sizeof(B) = 1 Peshuha Паковка тут не при чем, потому что sizeof-ы разные. Ation По стандарту не обязан. green Ну дык велик и могуч Видимо не лучший А ты что ожидал увидеть? 0.125? Quantum Как это понимать, Фаербол Фаерболыч? Это прямым текстом сказано в стандарте или ты сделал такой вывод основываясь на нескольких косвенных утверждениях?
Quantum class от struct отличается лишь тремя моментами, дефолтный доступ к, извиняюсь, членам, дефолтный доступ при наследовании и третье, в template нельзя писать struct. Все, отличий больше нет никаких, так что class на struct менять не надо
_DEN_ Intel C++ 9.0 видимо тоже не лучший С каких это пор VC++ считается критерием стандарта ? Я ожидал, что это дело эквивалентно Код (Text): class A { public: struct {char a1:1, a2:1, a3:1, a4:1, a5:1, a6:1, a7:1, a8:1;}; };
_DEN_ Мой вам дружеский совет: почитайте сначала стандарт ANSI C. См. выше. А я и сам знаю, что они на первый взгляд очень похожи int тоже на первый взгляд очень похож на long. Может отныне забедем о long и будем использовать только int?
о каких стандартах может говорить человек, использующий битовые поля в typedef? :p удивительно, как вообще такое компилируется.