Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Вниз

Что такое $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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
4-1123704459
SergProger
2005-08-11 00:07
2005.10.09
Коды клавиш


3-1125383855
rentgen
2005-08-30 10:37
2005.10.09
Как очистить базу MDB?


3-1124880664
Слава-АБС
2005-08-24 14:51
2005.10.09
Открытие Dbf через ADO


14-1127127094
Rentgen
2005-09-19 14:51
2005.10.09
IFS - Образ для загрузки ОС?


14-1126453651
Fin
2005-09-11 19:47
2005.10.09
Литература про Mac OS X.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский