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

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



On Monday 02 May 2005 09:18, Victor Wagner wrote:

> On 2005.05.01 at 23:25:53 +0300, Dmitry Nezhevenko wrote:
> > #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.
>
> Это нормально, все так живут. Структура - понятие высокоуровневое, и
> программиста не должно волновать как именно она размещена в памяти
> (потому что на разных процессорах всё равно по-разному ляжет).

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


>
> > gcc version 3.3.5 (Debian 1:3.3.5-8)
> >
> >
> > --
> > To UNSUBSCRIBE, email to debian-russian-REQUEST@lists.debian.org
> > with a subject of "unsubscribe". Trouble? Contact
> > listmaster@lists.debian.org



Reply to: