Выравнивание в Delphi
он по идее char-ы не выравнивает, тогда получается:
0-8: ii
8(8-16):a
16-20:i
20(20-24):b
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

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

в случае выравнивания на 4 последние (7) превратятся в (3 что даст 20. Кстати, это как раз и есть наименее логичный вариант.
Теперь вопрос для усвоивших материал: когда может пригодиться выравнивание на 7 и как его замутить?
Теперь вопрос для усвоивших материал: когда может пригодиться выравнивание на 7 и как его замутить?
почему alignment для a равен 3? глобальный alignment равен 8.
почему i выравнен на границу в 4 байта, а не на 8?
почему i выравнен на границу в 4 байта, а не на 8?
делай может через packed record, так надежнее.
у дельфей свой собственный манагер памяти. (я в свое время мозг сломал, когда мне массив из сишной длл надо было принять - на 86 и 64 машинах по разному работало
)
з.ы. у тебя праблемы какие-то, или ты просто возмущаешься?
у дельфей свой собственный манагер памяти. (я в свое время мозг сломал, когда мне массив из сишной длл надо было принять - на 86 и 64 машинах по разному работало
)з.ы. у тебя праблемы какие-то, или ты просто возмущаешься?
просто возмущаюсь.
при наладке взаимодействия между системами возникли траблы.
одна приблуда пише array of record через BlockWrite, другая побайтово считывает.
при наладке взаимодействия между системами возникли траблы.
одна приблуда пише array of record через BlockWrite, другая побайтово считывает.
Я же написал, потому что он (i) четыре байта, ему не надо выравниваться на 8. Тут же все не для забавы программиста, а потому что невыровненный доступ медленнее, а на некоторых архитектурах и вообще приводит к прерыванию, с возможной последующей софтварной обработкой необходимых действий. А глобальное выравнивание не заставит выравнивать i на 8.
советую кстати проверить совместимость 86 и 64 кстати (хотя щас все машины вроде 64 ) 

в чём тогда смысл выравнивания, если элементы структуры не выравниваются на начало блока выравнивания?
ну винда стоит 32битная, компилятор 32битный, на 64 пока пох
потому что это глобальное выравнивание, как ты его называешь, влияет на выравнивание самой структуры, а не полей внутри нее. Точнее косвенно, оно, конечно, влияет, но смысл этого числа (выравнивание на 4) не в том, чтобы все поля на него выравнивать, а в том, чтобы размер структуры был ему кратен.
Оставить комментарий
yolki
простите, но это взорвало мой мозг..ответ: 24
ставим выравнивание в 4 байта, ответ: 20 (что логично).
выравнивание по 1, ответ 14, что логично.
но 24 при 8 ?