Выравнивание в Delphi

yolki

простите, но это взорвало мой мозг..

{$APPTYPE CONSOLE}
type
t=record
ii: Int64;
a:char;
i:integer;
b:char;
end;
begin
writeln(sizeof(t;
end.

ответ: 24
ставим выравнивание в 4 байта, ответ: 20 (что логично).
выравнивание по 1, ответ 14, что логично.
но 24 при 8 ?

Dasar

он по идее char-ы не выравнивает, тогда получается:
0-8: ii
8(8-16):a
16-20:i
20(20-24):b

yolki

что изменится, если заменить char на word ?

Dasar

скорее всего размер уже будет 32

yolki

да не, всё ещё 24..

tasik89

Может int64 выравнивается на 4? Типа как структурка из двух интов... :confused:

tasik89

c:ed60:db7:82b0:9b4c
:ooo:

tasik89

А, тфу, считать разучился. 24 же делится на 8.
Тут все логично же до чертиков. В чем смысл выранивания? Чтобы поля были расположены по адресам, кратным своему размеру, в том числе когда забабахан массив структурок. Поэтому получаем раскладку
8 ii
1 a
(3) <alignment>
4 i
1 b
(7) <alignment>
7 — потому что следующий ii должен быть по кратному восьми адресу.
Если поменять местами поля i и b, то станет 16, может быть :grin:

tasik89

в случае выравнивания на 4 последние (7) превратятся в (3 что даст 20. Кстати, это как раз и есть наименее логичный вариант.
Теперь вопрос для усвоивших материал: когда может пригодиться выравнивание на 7 и как его замутить?

yolki

почему alignment для a равен 3? глобальный alignment равен 8.
почему i выравнен на границу в 4 байта, а не на 8?

kill-still

делай может через packed record, так надежнее.
у дельфей свой собственный манагер памяти. (я в свое время мозг сломал, когда мне массив из сишной длл надо было принять - на 86 и 64 машинах по разному работало :grin: )
з.ы. у тебя праблемы какие-то, или ты просто возмущаешься?

yolki

просто возмущаюсь.
при наладке взаимодействия между системами возникли траблы.
одна приблуда пише array of record через BlockWrite, другая побайтово считывает.

tasik89

Я же написал, потому что он (i) четыре байта, ему не надо выравниваться на 8. Тут же все не для забавы программиста, а потому что невыровненный доступ медленнее, а на некоторых архитектурах и вообще приводит к прерыванию, с возможной последующей софтварной обработкой необходимых действий. А глобальное выравнивание не заставит выравнивать i на 8.

kill-still

советую кстати проверить совместимость 86 и 64 кстати (хотя щас все машины вроде 64 ) ;)

yolki

в чём тогда смысл выравнивания, если элементы структуры не выравниваются на начало блока выравнивания?

yolki

ну винда стоит 32битная, компилятор 32битный, на 64 пока пох

tasik89

потому что это глобальное выравнивание, как ты его называешь, влияет на выравнивание самой структуры, а не полей внутри нее. Точнее косвенно, оно, конечно, влияет, но смысл этого числа (выравнивание на 4) не в том, чтобы все поля на него выравнивать, а в том, чтобы размер структуры был ему кратен.
Оставить комментарий
Имя или ник:
Комментарий: