Текущий архив: 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.47 MB
Время: 0.011 c