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

  • Автор темы Guest
  • Дата начала
G

Guest

#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);
Больше не какого кода нет!
 
04.09.2006
2 566
3
#3
Для: Щенок
В настройках компилятора можно изменит дефолтовое выравнивание в 1б, тогда размер будет 56, если тебе это так нужно
 
B

boden

#4
Для: Щенок
В настройках компилятора можно изменит дефолтовое выравнивание в 1б, тогда размер будет 56, если тебе это так нужно
Зачем? Это скажется на выравнивании в других местах, что может оказаться фатальным. По ссылке, которую дал Pasha есть хороший пример
Код:
#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 */
 
04.09.2006
2 566
3
#5
<!--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]
При корректном коде, ничего фатального
 
P

Pasha

#6
Для: European
Осталось только обеспечить корректность кода и одинаковые настройки компилятора у всех, кто попытается работать c исходниками или API мегасофтины.
 
04.09.2006
2 566
3
#7
Мля, давайте на меня еще кроссплатформенность натравим! Если человек первый раз видит выравнивание, о чем может быть речь?
 
P

Pasha

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