Определение размера структуры с помощью Sizeof

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем -, 24 окт 2007.

  1. Гость

    Подскажите кто знает!

    Пишу на C++ Builder 2007.

    Имеется такая структура

    struct log_adat_type
    {
    char type; //Тип устройства //1 Байт
    char XXXXXXX[3]; //3 Байта
    double datum; //Дата приема данных //8 Байт
    double ido; //Время приема данных //8 Байт
    unsigned short busz; //Код мобильного интерфейса //2 Байта
    unsigned short kodado; //Код остановки //2 Байта
    unsigned short interface1; //2 Байта
    unsigned short interface2; //2 Байта
    unsigned short kezelo_ID_1; //Kezelõ_Id_1 As Integer //2 Байта
    unsigned short kezelo_ID_2; //Kezelõ_Id_2 As Integer //2 Байта
    unsigned short stage_number_1; //Munkaállás_Sorszám_1 As Integer //2 Байта
    unsigned short stage_number_2; //Munkaállás_Sorszám_2 As Integer //2 Байта*/
    double joint_time_period; //Kapcsolódó_Idõpont As Double //8 Байта
    unsigned short adat_1; //Adat_1; //2 Байта
    unsigned short adat_2; //Adat_2 As Integer //2 Байта
    unsigned short adat_3; //2 Байта
    char state_1; //Státusz //1 Байт
    char state_2; //Státusz_2 As String * 1 //1 Байт
    char state_3; //Státusz_3 As String * 1 //1 Байт
    char state_4; //Státusz_4 As String * 1 //1 Байта
    char XXXXXX[2]; //As String * 2 //2 Байта
    } dataRead;

    Структурка была взята из бэйсика там она размером 56 байт
    Поменял все типы как надо посчитал в ручную занимает тоже 56 байт!

    Но когда определяю размер структуры с помощью sizeof то получается что она размером 64 байта!
    Как такое получается???

    Если все зарэмить кроме первых двух чаров выдает размер 4
    Если заремить все кроме двух первых Даблов выдает 16
    А если все зарэмить кроме первых четырех строчек где два Чара и два Дабла выдает 24 как так получается?

    Получается если данные в структуре одного типа то все правильно размер считается а если разных то не правильно!
    К примеру если оставить один чар и один дабл то почему то размер структуры будет 16 байт!
    Что я не так делаю то???

    Вывод на экран через Edit1->Text = sizeof (dataRead);
    Больше не какого кода нет!
     
  2. Pasha

    Pasha Гость

  3. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Щенок
    В настройках компилятора можно изменит дефолтовое выравнивание в 1б, тогда размер будет 56, если тебе это так нужно
     
  4. boden

    boden Гость

    Зачем? Это скажется на выравнивании в других местах, что может оказаться фатальным. По ссылке, которую дал Pasha есть хороший пример
    Код (Text):
    #pragma pack(push) /* push current alignment to stack */
    #pragma pack(1)  /* set alignment to 1 byte boundary */

    struct MyPackedData
    {
    char Data1;
    long Data2;
    char Data3;
    };

    #pragma pack(pop)  /* restore original alignment from stack */
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-boden+29:10:2007, 10:33 -->
    <span class="vbquote">(boden @ 29:10:2007, 10:33 )</span><!--QuoteEBegin-->Это скажется на выравнивании в других местах, что может оказаться фатальным
    [snapback]83383" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    При корректном коде, ничего фатального
     
  6. Pasha

    Pasha Гость

    Для: European
    Осталось только обеспечить корректность кода и одинаковые настройки компилятора у всех, кто попытается работать c исходниками или API мегасофтины.
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Мля, давайте на меня еще кроссплатформенность натравим! Если человек первый раз видит выравнивание, о чем может быть речь?
     
  8. Pasha

    Pasha Гость

    Для: European
    Речь о том, что не надо вести человека на грабли, надо по возможности обводить :)
     
Загрузка...

Поделиться этой страницей