Выравнивание в Delphi
0-8: ii
8(8-16):a
16-20:i
20(20-24):b
что изменится, если заменить char на word ?
скорее всего размер уже будет 32
да не, всё ещё 24..
Может int64 выравнивается на 4? Типа как структурка из двух интов...
c:ed60:db7:82b0:9b4c
Тут все логично же до чертиков. В чем смысл выранивания? Чтобы поля были расположены по адресам, кратным своему размеру, в том числе когда забабахан массив структурок. Поэтому получаем раскладку
8 ii
1 a
(3) <alignment>
4 i
1 b
(7) <alignment>
7 — потому что следующий ii должен быть по кратному восьми адресу.
Если поменять местами поля i и b, то станет 16, может быть
Теперь вопрос для усвоивших материал: когда может пригодиться выравнивание на 7 и как его замутить?
почему i выравнен на границу в 4 байта, а не на 8?
у дельфей свой собственный манагер памяти. (я в свое время мозг сломал, когда мне массив из сишной длл надо было принять - на 86 и 64 машинах по разному работало )
з.ы. у тебя праблемы какие-то, или ты просто возмущаешься?
при наладке взаимодействия между системами возникли траблы.
одна приблуда пише array of record через BlockWrite, другая побайтово считывает.
Я же написал, потому что он (i) четыре байта, ему не надо выравниваться на 8. Тут же все не для забавы программиста, а потому что невыровненный доступ медленнее, а на некоторых архитектурах и вообще приводит к прерыванию, с возможной последующей софтварной обработкой необходимых действий. А глобальное выравнивание не заставит выравнивать i на 8.
советую кстати проверить совместимость 86 и 64 кстати (хотя щас все машины вроде 64 )
в чём тогда смысл выравнивания, если элементы структуры не выравниваются на начало блока выравнивания?
ну винда стоит 32битная, компилятор 32битный, на 64 пока пох
потому что это глобальное выравнивание, как ты его называешь, влияет на выравнивание самой структуры, а не полей внутри нее. Точнее косвенно, оно, конечно, влияет, но смысл этого числа (выравнивание на 4) не в том, чтобы все поля на него выравнивать, а в том, чтобы размер структуры был ему кратен.
Оставить комментарий
yolki
простите, но это взорвало мой мозг..ответ: 24
ставим выравнивание в 4 байта, ответ: 20 (что логично).
выравнивание по 1, ответ 14, что логично.
но 24 при 8 ?