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: