Вопрос по любимому C++

Тема в разделе "WASM.ZEN", создана пользователем _DEN_, 28 дек 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Что на каких компиллерах получается и что впринципе должно быть?
    Код (Text):
    1. class A
    2. {
    3. public:
    4.  
    5.   typedef char bit:1;
    6.  
    7.   bit a1, a2, a3, a4, a5, a6, a7, a8;
    8. };
    9.  
    10. sizeof(A) ???
     
  2. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    Ответ всегда один : смотря какая паковка. Пользоваться такими вещами не рекомендуется
     
  3. Ation

    Ation New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2005
    Сообщения:
    92
    Адрес:
    Zaporozhie
    Лучше пользоватся 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;

    };
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine


    странная конструкция, впервые вижу.



    У меня VC++ позволяет такие typedef-ы внутри классов.

    В твоем примере каждый "бит" имеет размер 1 байт, т.е. это не битовое поле.



    Comeau C++ (лучший по части соблюдения стандарта) вообще такое не компилит.
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _DEN_

    Если оформить по стандарту, то занимать это будет 1 байт (sizeof(A) == 1). Я бы в первую очередь поменял class на struct. Паковка тут не имеет значения абсолютно (ну, за исключением 7-битных машин, коих уже нет).



    Ation

    Во-первых, почему в вашем примере unsigned int совмещается с char? Во-вторых, чем этот union лучше обычного bitfield'а?



    А bitfield'ами пользоваться действительно не рекомендуется, т.к. получается больше кода, возникает зависимость от платформы. В общем случае, его лучше заменить на логические операции с масками.



    Peshuha

    Если создать массив из 10 таких структур, он будет занимать больше 10 байт? ... Поэтому, в данном случае (все биты помещаются в 1 байт), паковка не имеет значения.
     
  6. Ation

    Ation New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2005
    Сообщения:
    92
    Адрес:
    Zaporozhie
    Quantum

    Насколько мне известно char везде занимает ровно адын байт

    Структура Byte содержит ровно 8 полей (по биту каждый)

    А инт или чар для одного бита не имеет значения.

    А насчет того что лучше, действительно фраза несколько неуместна )

    Просто ИМХО в юнионе проще работать.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Мужики, не надо меня наставлять как "надо" писать, а как "не надо" писать :)) Меня такие вопросы интересуют лишь с точки зрения "тонкостей" стандарта. А вопрос возник потому что на моей 7.1 картина такая


    Код (Text):
    1.  
    2. class A
    3. {
    4. public:
    5.  
    6.   typedef char bit:1;
    7.  
    8.   bit a1, a2, a3, a4, a5, a6, a7, a8;
    9. };
    10.  
    11. class B
    12. {
    13. public:
    14.  
    15.   char a1:1, a2:1, a3:1, a4:1, a5:1, a6:1, a7:1, a8:1;
    16. };
    17.  
    18. sizeof(A) = 8
    19. sizeof(B) = 1
    20.  




    Peshuha

    Паковка тут не при чем, потому что sizeof-ы разные.



    Ation



    По стандарту не обязан.



    green





    Ну дык велик и могуч :)







    Видимо не лучший ;)







    А ты что ожидал увидеть? 0.125? :)



    Quantum





    Как это понимать, Фаербол Фаерболыч? Это прямым текстом сказано в стандарте или ты сделал такой вывод основываясь на нескольких косвенных утверждениях?
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Quantum





    class от struct отличается лишь тремя моментами, дефолтный доступ к, извиняюсь, членам, дефолтный доступ при наследовании и третье, в template нельзя писать struct. Все, отличий больше нет никаких, так что class на struct менять не надо ;)
     
  9. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_



    Intel C++ 9.0 видимо тоже не лучший :)

    С каких это пор VC++ считается критерием стандарта ? :derisive:





    Я ожидал, что это дело эквивалентно
    Код (Text):
    1.  
    2. class A
    3. {
    4. public:
    5.   struct {char a1:1, a2:1, a3:1, a4:1, a5:1, a6:1, a7:1, a8:1;};
    6. };
    7.  
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _DEN_



    Мой вам дружеский совет: почитайте сначала стандарт ANSI C.





    См. выше.





    А я и сам знаю, что они на первый взгляд очень похожи :) int тоже на первый взгляд очень похож на long. Может отныне забедем о long и будем использовать только int?
     
  11. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia


    о каких стандартах может говорить человек, использующий битовые поля в typedef? :p

    удивительно, как вообще такое компилируется.
     
  12. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    Считаю тему полным флудом. Кого обидел - сорри