Главная страница
    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.013 c
1-1127028683
vidiv
2005-09-18 11:31
2005.10.09
Распознование ссылок в тексте


1-1126790061
Leonid
2005-09-15 17:14
2005.10.09
Преобразование из Фортрана в Паскаль


14-1126752415
vrem
2005-09-15 06:46
2005.10.09
Как на вас влияет пятно на солнце? :)


14-1127049069
Piter
2005-09-18 17:11
2005.10.09
Програма для просмотра свойств WMV видео


3-1125310756
Shaman_
2005-08-29 14:19
2005.10.09
Не могу выполнить выборку на NULL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский