Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: CL | DM;

Вниз

Какова логика выравнивания полей в записи ?   Найти похожие ветки 

 
Skier ©   (2003-05-12 16:14) [0]

Господа, помогите в таком вот вопросе (читал хелп, но там мало, в
общем я не разобрался...) :

Как происходит, т.е. какова логика выравнивания полей в записи
при {$A+}

Если можно объясните на пальцах.

Пальцы такие :

1) TSomeRec = record
srF1 : Extended;
srF2 : Extended;
srF3 : Char;
end; //TSomeRec

2) TSomeRec2 = record
srF3 : Char;
srF1 : Extended;
srF2 : Extended;
end; //TSomeRec

SizeOf(TSomeRec) = 32 байта
SizeOf(TSomeRec2) = 40 байт

Как всё это дело вычисляется, т.е. какая(ов) логика (алгоритм) ?

Памажите !


 
Anatoly Podgoretsky ©   (2003-05-12 16:33) [1]

Ну со вторым понятно, выравнял Extended на границу 8 байт: 8+16+16
А вот первую наверно 16+12+4 - тоже 8 байт для Extended и 4 для остальных

Правил выравнивания нигде не видел. В Д6 и Д7 возможности выравнивания еще выше, не знаю сделали в Д7 выравнивание на выравнивания на границу 16 байт или нет, а оно очень нужно для Р4


 
Игорь Шевченко ©   (2003-05-12 16:51) [2]

Object Pascal Language Guide внимательно читаем...

"Record type field alignment is described in the Object Pascal Language Guide."


 
Skier ©   (2003-05-12 16:55) [3]

>Игорь Шевченко
Я же говорю, что читал, смотрим вопрос... :)
Не мог бы на примере объяснить ?


 
Johnmen ©   (2003-05-12 17:16) [4]

1) 10->2*8 + 10->2*8 = 32 из которых 1 байт под char
2) 1->8 + 10->2*8 + 10->2*8 = 40


 
McSimm ©   (2003-05-12 17:20) [5]

1)
srF1 : Extended; - alignment 8, size 10
srF2 : Extended; - alignment 8, size 10
srF3 : Char; - alignment 1, size 1
Finally, the compiler rounds the total size of the record upward to the byte boundary specified by the largest alignment of any of the fields.

Получается расклад по смещениям:
srF1: 0-9
unused: 10-15
srF2: 16-26
srF3: 27
unused: 28-31
-------------------------------------
2)
srF3: 0
unused: 1-7
srF1: 8-18
unused: 19-23
srF2: 24-34
unused: 35-39


 
MBo ©   (2003-05-12 17:21) [6]

{$A+}
procedure TForm1.Button1Click(Sender: TObject);
type
TSomeRec = record
srF1 : Extended;
srF2 : Extended;
srF3 : Char;
end; //TSomeRec

TSomeRec2 = record
srF3 : Char;
srF1 : Extended;
srF2 : Extended;
end; //TSomeRec
var a:TSomeRec;
b:TSomeRec2;
BEGIN
Memo1.Lines.Add(IntToStr(SizeOf(a)));
Memo1.Lines.Add(IntToStr(Integer(@a.srF1)-Integer(@a)));
Memo1.Lines.Add(IntToStr(Integer(@a.srF2)-Integer(@a)));
Memo1.Lines.Add(IntToStr(Integer(@a.srF3)-Integer(@a)));
Memo1.Lines.Add("");

Memo1.Lines.Add(IntToStr(SizeOf(b)));
Memo1.Lines.Add(IntToStr(Integer(@b.srF3)-Integer(@b)));
Memo1.Lines.Add(IntToStr(Integer(@b.srF1)-Integer(@b)));
Memo1.Lines.Add(IntToStr(Integer(@b.srF2)-Integer(@b)));
end;

32
0
16
26

40
0
8
24


 
Skier ©   (2003-05-12 17:28) [7]

>Johnmen
Я так понял что alignment из таблицы type alignment masks (Object Pascal Reference), это есть множитель 8-ки ?
И кстати почему именно 8 байт ?
Ведь слово это 2 байта, а двойное слово - 4 байта


 
Anatoly Podgoretsky ©   (2003-05-12 17:34) [8]

Там есть есть одна особенность, связанная с математическим соопроцессором, ему требуется что бы операнд был выровнен по границе 8 байт.


 
Johnmen ©   (2003-05-12 17:35) [9]

>Skier © (12.05.03 17:28)

Насколько помню, там и написано quad-word :) Т.е. = 8


 
Skier ©   (2003-05-12 17:36) [10]

>McSimm © (12.05.03 17:20)

Судя по хелпу, (alignment - 2 for Real48 and Extended ) не так :
srF1 : Extended; - alignment 2, size 10
srF2 : Extended; - alignment 2, size 10
srF3 : Char; - alignment 1, size 1


 
Skier ©   (2003-05-12 17:37) [11]

>Johnmen © (12.05.03 17:35)

Из хелпа :

By default, the values in a structured type are aligned on word or double-word boundaries for faster access.


 
McSimm ©   (2003-05-12 17:49) [12]

>Судя по хелпу, (alignment - 2 for Real48 and Extended ) не так :

Цитата из LG:
Alignment 2 for Real48, 4 for Single, 8 for Double and Extended


 
Skier ©   (2003-05-12 17:52) [13]

>McSimm © (12.05.03 17:49)
Shit. Я совсем запутался...
А вот моя цитата из LG (книжка перед глазами - D5 Enterprise).
Цитирую :
Alignment 2 for Real48 and Extended, 4 for all other real types

И что нам с этим делать ? :)


 
Johnmen ©   (2003-05-12 17:53) [14]

>Skier © (12.05.03 17:37)

Это старый-старый хелп... :)

In the {$A8} or {$A+} state, fields in record types that are declared without the packed modifier and fields in class structures are aligned on quad-word boundaries.


 
Skier ©   (2003-05-12 18:00) [15]

>Johnmen © (12.05.03 17:53)

> Это старый-старый хелп... :)

Не знаю, не знаю...но у меня стоит лицензионная D5 Enterprise (и, соответственно, хелп от неё), которая стоила много баксиков.

Караул ! Кому же верить-то ?! :)
Судя по тому что выводиться в SizeOf(...), то
похожи на правду посты
McSimm © (12.05.03 17:20) и Johnmen © (12.05.03 17:53)

Чаво делать-то ? :)


 
Anatoly Podgoretsky ©   (2003-05-12 18:07) [16]

В Д6 сказано
Real type 2 for Real48, 4 for Single, 8 for Double and Extended
Возможно в Д5 неверный хелп, очень часто он отстает от действительности


 
Skier ©   (2003-05-12 18:10) [17]

>Anatoly Podgoretsky © (12.05.03 18:07)
Да, очень похоже...


 
Anatoly Podgoretsky ©   (2003-05-12 18:16) [18]

Мне кажется да и размеры показывают, что выравнивание на границу 8 байт. А хелп исаравляется иногда только через две версии, хотя у меня установлен самый последний для Д5


 
Skier ©   (2003-05-14 11:57) [19]

>McSimm © (12.05.03 17:20)
1) Вычислить расклад по смещениям, зная адреса полей - задача
тривиальная. Но вопрос-то как раз в том как эти адреса и размер
записи вычисляются
2)

> srF1: 0-9
> unused: 10-15
> srF2: 16-26
> srF3: 27
> unused: 28-31


IMHO, вот так правильней :

unused: 0-5
srF1: 6-15
srF2: 16-26
unused: 27-30
srF3: 31


 
MBo ©   (2003-05-14 12:52) [20]

>IMHO, вот так правильней
С чего бы это????
поле должно начинаться по "ровному" адресу
Тест (12.05.03 17:21) видел?


 
Skier ©   (2003-05-14 12:58) [21]

>MBo © (14.05.03 12:52)
Видел.

> поле должно начинаться по "ровному" адресу

26 - это "ровный" адрес ?



 
McSimm ©   (2003-05-14 12:58) [22]

>Skier © (14.05.03 11:57)
Вообще-то я в своем посте ошибки заметил(я делал без Делфи, не проверяя), но не стал их исправлять, т.к. MBo это сделал.

Однако то что ты пишешь мне не понятно. Смотри:

srF1: Exnended;
Выравнивание на 8, т.е. смещение будет 0.
Длина 10 байт, поэтому расклад 0-9

srF2: Exnended;
Выравнивание на 8, т.е. от позиции 10 до 15 пропуск, смещение будет 16.
Длина 10 байт, поэтому расклад 16-25

srF3: Char;
Выравнивание на 1, т.е. размещается в 26
Размер 1, значит расклад 26-26

Record выравнивается по размеру, чтобы быть кратным максимальному значению выравнивания своих членов, т.е 8.
Поэтому байты с 27 до 31 будут принадлежать record, но не использоваться.

Имеем:
srF1: 0-9
unused: 10-15
srF2: 16-25
srF3: 26
unused: 27-31


 
MBo ©   (2003-05-14 13:06) [23]

>26 - это "ровный" адрес ?
Для Char - да. А Extended на 8 выровнены.



 
Skier ©   (2003-05-14 13:29) [24]

>McSimm & MBo
Вроде проблема для меня проясняется....
Господа, главное в выравнивании это то что поле (его адрес) должно начинаться по "ровному" (в зависимости от типа поля) адресу ? Так ?


 
Anatoly Podgoretsky ©   (2003-05-14 13:35) [25]

Так, ровный именно для первой составляющей


 
MBo ©   (2003-05-14 13:36) [26]

Да, так обеспечивается наиболее быстрый доступ.
always aligned for optimal access. In the {$A+} state, execution will be faster.


 
Skier ©   (2003-05-14 13:40) [27]

Всё. Понял.
Всем кто принимал участие в разъяснении выражаю
глубокое решпектование !



Страницы: 1 вся ветка

Текущий архив: 2003.05.26;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.029 c
1-83438
Андрей
2003-05-13 08:08
2003.05.26
Как ограничить кол-во одновременно запущенных потоков


8-83617
zenov
2003-02-12 15:55
2003.05.26
multimedia


7-83772
GydruS
2003-03-21 08:32
2003.05.26
Получение данных о линейном входе и понижение его громкости


3-83400
Солер
2003-05-06 16:59
2003.05.26
Как отменить запрос?


8-83610
Vadim840
2003-02-12 12:59
2003.05.26
Фото формы