![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что такое $ALIGN ваще и $ALIGN 8 в частности
Fay © (2005-08-26 13:59:00)Сабж.
У меня не настольно хорошо с американским языком, чтобы я мог бозоговорочно доверять собственному переводу help-а 8((
MBo (2005-08-26 16:02:00) [1]>Digitman © (26.08.05 15:42) [9]
>экспериментально, надеюсь, проверено
Хелп можно понять так, что любые поля выравниваются на то значение, что указано в Align, однако адреса байтовых полей в реальности не выравниваются, Word - располагается сразу за предыдущим в случае $A1 или по четному адресу в случае $A2 и выше, но не по адресу, кратному 4 или 8 и т.д.
Digitman (2005-08-26 15:42:00) [2]
> MBo © (26.08.05 14:43) [4]
под данными я и подразумевал поля структур .. мне следовало быть точней ..
по поводу неточностей в хэлпе - экспериментально, надеюсь, проверено тобой ?
Fay (2005-08-26 15:31:00) [3]2 MBo © (26.08.05 15:27) [7]
>> Так в результате разобрался?
Имея перед глазами Min(SizeOf(Field),AlignParam)и значения смещений?
Конечно! 8)
Спасибо ещё раз. Мне эта "формула" так и не пришла в голову.
MBo (2005-08-26 15:27:00) [4]>Fay © (26.08.05 15:00) [5]
Так в результате разобрался?
Fay (2005-08-26 15:01:00) [5]Отдельное спасибо модератору за "Начинающих".
Польщён.
Fay (2005-08-26 15:00:00) [6]2 MBo © (26.08.05 14:31) [3]
Такой (почти) код я уже писал. Не понял ничего.
2 MBo © (26.08.05 14:43) [4]
>> Хелп не вполне точен.
Блин! Вот и мне так показалось!
Спасибо, а то я уже чуть не сдвинулся.
MBo (2005-08-26 14:43:00) [7]>Digitman © (26.08.05 14:21) [2]
Увы, это не так...
Директива лишь позволяет выравнивать поля записи (или объектов)
относительно начала записи, но не на кратное 8 (в случае $A8), а на кратное Min(SizeOf(Field),AlignParam). Хелп не вполне точен.
MBo (2005-08-26 14:31:00) [8]http://groups.google.ru/group/borland.public.delphi.language.objectpascal/browse_frm/thread/61967bd00bcd6308/816b582aa37473c1?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;
Digitman (2005-08-26 14:21:00) [9]это директива, предписывающая компилятору при резервировании памяти под те или иные объявленные тобой данные выравнивать начальный адрес их месторазмещения в памяти по указанной границе.
например, при align8 компилятор обязан размещать твои данные по неким начальным адресам, обязательно кратным 8-ми : 8, 16, 24, 32, ... n * 2^3 .. (n+1)*2^3 .. и т.д.
т.е. при align8 компилятор не имеет права и никогда не разместит, например, будущую integer-переменную по адресу, например, равному 1020, даже если 4 байта памяти (требуемые для хранения integer) в диапазоне адресов 1020..1023 "свободны"..
ближайшее в порядке возрастания число, кратное 8-ми, это 1024, вот по этому адресу компилятор и будет вправе разместить эту твою переменную, если 4 байта начиная с адреса 1024 ни под что более не были зарезервированы перед этим
Наиль (2005-08-26 14:15:00) [10]У меня тоже с языком не очень. Но насколько я понял суть, дело в том, что данные в памяти записываются не всегда плотно.
Например, вRecord...End, в отличии отPacked Record...End.
Другими солвами, при $алигн 8, адреса по которым расположены данные, будут кратны 8.
PS. Поправте меня, если я не прав.