[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Как это понимать



Dmitry Nezhevenko -> debian-russian@lists.debian.org  @ Tue, 3 May 2005 00:12:21 +0300:

 >> > #include <stdio.h>
 >> > int main(void)
 >> > {
 >> >  struct oneRec
 >> >  {
 >> >   char b1;
 >> >    char b2;
 >> >   short id;
 >> >   char lang;
 >> >   char b3[2];
 >> >   char b4[2];
 >> >
 >> >  };
 >> >
 >> > У меня она выдает:
 >> > sizeof(char)=1
 >> > sizeof(short)=2
 >> > sizeof(struct oneRec)=10
 >> >
 >> > А теперь считаем b1, b2 - по байту, id - 2 байта, lang - 1 байт, b3 = 2
 >> > байта, b4 = 2 байта. В сумме 9 байт. Но почему sizeof(struct oneRec)=10?
 >>
 >> Ну так выравниване. Скорее всего, положение поля b3 (двухбайтового)
 >> выравнено по четному адресу. Это тебе еще повезло что на выравнивание
 >> ровно один байт ушел.
 >>
 >> struct te {
 >>     char c;
 >>  int b;
 >>  char d;
 >>  double x;
 >> };
 >>
 >> Вот эта штука имеет размер 20 байт Поскольку под Linux ix86 int и double
 >> выравниваются на адрес кратный 4 байтам.
 >>
 >> А на Sparc, где требования к выравниванию по-строже (double должен
 >> размещаться по адресу кратному 8 байтам) аж 24.
 >>
 >> Это нормально, все так живут. Структура - понятие высокоуровневое, и
 >> программиста не должно волновать как именно она размещена в памяти
 >> (потому что на разных процессорах всё равно по-разному ляжет).

 DN> Нет, волновать то должно. Просто у меня файл есть (уже есть, созданный не 
 DN> мною). с такой инфой.

Так читают файлы read'ом прямо в структуру только особо продвинутые
герои, которым нечего терять.  Остальные читают поэлементно.

-- 
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru

Обладаю смехотворными способностями.
	Кнышев



Reply to: