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

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



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: