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

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



On Tuesday 03 May 2005 00:12, Dmitry Nezhevenko wrote:

> 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.
> >
> > Это нормально, все так живут. Структура - понятие высокоуровневое, и
> > программиста не должно волновать как именно она размещена в памяти
> > (потому что на разных процессорах всё равно по-разному ляжет).
>
> Нет, волновать то должно. Просто у меня файл есть (уже есть, созданный не
> мною). с такой инфой.


На ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 
2.4.0, dynamically linked (uses shared libs), not stripped

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: