Не понятность в определении размера класса!

Тема в разделе "WASM.ZEN", создана пользователем EvilsInterrupt, 24 ноя 2005.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    День добрый, прошу глянуть на код:
    Код (Text):
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. class Data
    6. {
    7. public:
    8.         short int       CodeObj; //DA
    9.         float           ValueObj;
    10.         short int       status;
    11. };
    12.  
    13.  
    14.  
    15. int main()
    16. {
    17.     unsigned char array[8] = {0x90,0x65,0x0,0x0,0x0,0x0,0x01,0x0};
    18.     Data    * pData = (Data *)(&array);
    19.     cout << endl << "code:\t" << pData->CodeObj << "\t" << sizeof(pData->CodeObj) << endl;
    20.     cout << endl << "value:\t" << pData->ValueObj << "\t" << sizeof(pData->ValueObj) << endl;
    21.     cout << endl << "status:\t" << pData->status << "\t" << sizeof(pData->status) << endl;
    22.  
    23.     cout << "sizeof(Data):\t" << sizeof(Data) << endl;
    24.     return 0;
    25. }


    Последняя строка cout должа вывать 8, а выдает 12! Почему?
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Код (Text):
    1. code:   26000   2
    2.  
    3. value:  9.18355e-041    4
    4.  
    5. status: -64     2
    6. sizeof(Data):   12
    7. Press any key to continue
     
  3. _DEN_

    _DEN_ DEN

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



    Компилер какой? Какие опции оптимизации?
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Visual C++ 6.0 этот код как примерочный, лишь бы заработал а далее подобное но на билдере с++ 6.0.

    Опции:

    /nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Debug/proba2.pch" /YX /Fo"Debug/"

    смею заметить по смотри на результат! Там вместо 0.0 выдалось икс игрек ... ху...
     
  5. nobody

    nobody New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2004
    Сообщения:
    32
    Адрес:
    Afghanistan
    По умолчанию поля структуры выровнены по границе 4 байт.

    4*3=12. Так что всё правильно...
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    А как убрать выравнивание?
     
  7. nobody

    nobody New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2004
    Сообщения:
    32
    Адрес:
    Afghanistan
    #pragma pack(1)
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Спасибо, а можно ли ее в биледере применить с тем же эффектом?
     
  9. _DEN_

    _DEN_ DEN

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



    А что, в билдере #pragma pack не работает?
     
  10. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    да, без проблем.

    только пиши правильно:

    перед своей структурой #pragma pack(push, 1)

    а потом #pragma pack(pop)

    в то потом так задалбывает вылавливать баги после включения хидеров с кривыми прагмами, которые забивают на то что они не одни...
     
  11. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Спасибо вам! а то я долго понять не мог че за дурь у меня! но все таки не понятно почему в float типе у меня в первом коде, выдавал не 0.0? Физика?
     
  12. _DEN_

    _DEN_ DEN

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



    почему в float типе у меня в первом коде, выдавал не 0.0?



    Потому что на float пришлись эти байты:

    0x0,0x0,0x01,0x0
     
  13. tigsid

    tigsid Member

    Публикаций:
    0
    Регистрация:
    11 июн 2004
    Сообщения:
    62
    #pragma pack(push, 1) // #pragma pack(pop) Это конечно правильно. Но коректно работает не под всеми компиляторами.

    Впервые столкнулся в *nix.

    А вот pack(1) // pack() проблем не вызывает. И пользоватся этим надо осторожно.
     
  14. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    какими ?
     
  15. tigsid

    tigsid Member

    Публикаций:
    0
    Регистрация:
    11 июн 2004
    Сообщения:
    62
    Хм. возможно я поторопился.

    Ну старые Dos компиляторы "C" могут вообще не понимать pack.

    Также проверил на машине I386 с FreeBSD 5.4 Release gcc 3.4.2.

    gcc сказала что эта платформа не поддерживает pack(push,1). Странно.
     
  16. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    идеала вообще нет в этой жизни. Ты определись с целевой платформой и компилером - тогде точный совет получишь :)
     
  17. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >tigsid

    .. не по теме, если не трудно чиркни мыло(профиль)