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: