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

Вниз

Что такое $ALIGN ваще и $ALIGN 8 в частности   Найти похожие ветки 

 
Fay ©   (2005-08-26 13:59) [0]

Сабж.
У меня не настольно хорошо с американским языком, чтобы я мог бозоговорочно доверять собственному переводу help-а 8((


 
Наиль ©   (2005-08-26 14:15) [1]

У меня тоже с языком не очень. Но насколько я понял суть, дело в том, что данные в памяти записываются не всегда плотно.
Например, в Record...End, в отличии от Packed Record...End.
Другими солвами, при $алигн 8, адреса по которым расположены данные, будут кратны 8.

PS. Поправте меня, если я не прав.


 
Digitman ©   (2005-08-26 14:21) [2]

это директива, предписывающая компилятору при резервировании памяти под те или иные объявленные тобой данные выравнивать начальный адрес их месторазмещения в памяти по указанной границе.

например, при align8 компилятор обязан размещать твои данные по неким начальным адресам, обязательно кратным 8-ми : 8, 16, 24, 32, ... n * 2^3 .. (n+1)*2^3 .. и т.д.

т.е. при align8 компилятор не имеет права и никогда не разместит, например, будущую integer-переменную по адресу, например, равному 1020, даже если 4 байта памяти (требуемые для хранения integer) в диапазоне адресов 1020..1023 "свободны"..

ближайшее в порядке возрастания число, кратное 8-ми, это 1024, вот по этому адресу компилятор и будет вправе разместить эту твою переменную, если 4 байта начиная с адреса 1024 ни под что более не были зарезервированы перед этим


 
MBo ©   (2005-08-26 14:31) [3]

http://groups.google.ru/group/borland.public.delphi.language.objectpascal/browse_frm/thread/61967bd00bcd6308/816b582aa37 473c1?tvc=1&q=how+to+write+a+4+byte+alignment+record&hl=ru#816b582aa37473c1

посты Danny Thorpe (это один из разработчиков компилятора)

демо-код:

procedure TForm1.Button2Click(Sender: TObject);
{$A1}
type
 TA1 = record
   b: byte;
   i: Integer;
   bb: byte;
   w: Word;
   q: Int64;
 end;
{$A2}
type
 TA2 = record
   b: byte;
   i: Integer;
   bb: byte;
   w: Word;
   q: Int64;
 end;
{$A4}
type
 TA4 = record
   b: byte;
   i: Integer;
   bb: byte;
   w: Word;
   q: Int64;
 end;
{$A8}
type
 TA8 = record
   b: byte;
   i: Integer;
   bb: byte;
   w: Word;
   q: Int64;
 end;

var
 a1: TA1;
 a2: TA2;
 a4: TA4;
 a8: TA8;
begin
 Caption := Format("%d %d %d %d",[SizeOf(a1),SizeOf(a2),SizeOf(a4),SizeOf(a8)]);
end;



 
MBo ©   (2005-08-26 14:43) [4]

>Digitman ©   (26.08.05 14:21) [2]
Увы, это не так...
Директива лишь позволяет выравнивать поля записи (или объектов)
относительно начала записи, но не на кратное 8 (в случае $A8), а на кратное Min(SizeOf(Field),AlignParam). Хелп не вполне точен.


 
Fay ©   (2005-08-26 15:00) [5]

2 MBo ©   (26.08.05 14:31) [3]
Такой (почти) код я уже писал. Не понял ничего.

2 MBo ©   (26.08.05 14:43) [4]
>> Хелп не вполне точен.
Блин! Вот и мне так показалось!
Спасибо, а то я уже чуть не сдвинулся.


 
Fay ©   (2005-08-26 15:01) [6]

Отдельное спасибо модератору за "Начинающих".
Польщён.


 
MBo ©   (2005-08-26 15:27) [7]

>Fay ©   (26.08.05 15:00) [5]
Так в результате разобрался?


 
Fay ©   (2005-08-26 15:31) [8]

2 MBo ©   (26.08.05 15:27) [7]
>> Так в результате разобрался?
Имея перед глазами Min(SizeOf(Field),AlignParam) и значения смещений?
Конечно! 8)
Спасибо ещё раз. Мне эта "формула" так и не пришла в голову.


 
Digitman ©   (2005-08-26 15:42) [9]


> MBo ©   (26.08.05 14:43) [4]


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

по поводу неточностей в хэлпе - экспериментально, надеюсь, проверено тобой ?


 
MBo ©   (2005-08-26 16:02) [10]

>Digitman ©   (26.08.05 15:42) [9]
>экспериментально, надеюсь, проверено

Хелп можно понять так, что любые поля выравниваются на то значение, что указано в Align, однако адреса байтовых полей в реальности не выравниваются, Word - располагается сразу за предыдущим в случае $A1 или по четному адресу в случае $A2 и выше, но не по адресу, кратному 4 или 8 и т.д.



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

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

Наверх




Память: 0.49 MB
Время: 0.024 c
14-1125337171
Rem
2005-08-29 21:39
2005.10.09
Список стран и городов


1-1127304615
voe
2005-09-21 16:10
2005.10.09
Отслеживания жизнидеятельности процесса


2-1125292719
Гриха
2005-08-29 09:18
2005.10.09
Полтергейст в TStrings


3-1125462043
MadGhost
2005-08-31 08:20
2005.10.09
Как пройтись по записям ADODataSet ?


4-1123766179
Dmitriy G.
2005-08-11 17:16
2005.10.09
Запуск Dll в отдельном потоке