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

Вниз

Условное описание   Найти похожие ветки 

 
Sung   (2005-12-07 09:53) [0]

В книге С. Бобровского "Delphi 7" натолкнулся на такой пример.

type
 TIntDetail = record
   case V : Byte of
     1 : (I : integer);
     2 : (B1, B2, B3, B4 : Byte);
   end;
var
 ID : TIntDetail;
begin
 ID.I := $FFFF;
 ...
end

Автор утверждает, что под I и B1, B2, B3, B4 отведена одна общая область памяти. Реально же в этом примере только B4 равно $FF, а B1, B2, B3 равны нулю.
Под отладчиком (включив окно CPU) я обнаружил, что поле B1 находится по смещению 1, B2 - 2, B3 - 3, B4 - 4. Поле I тоже 4. Т.е. перекрываются только I и B4.
Теперь я вообще ничего не понимаю. То ли я что-то не так сделал, то ли это такая хитрая оптимизация компилятора. Объясните, пожалуйста.


 
MBo ©   (2005-12-07 10:03) [1]

попробуй так:
TIntDetail =  packed record

заодно посмотри SizeOf(ID) при упакованной записи и без packed

кроме того, изучи влияние директивы компилятора {$A} (без packed)


 
Sung   (2005-12-07 10:24) [2]

Вот спасибо. Все понял.


 
Sapersky   (2005-12-07 13:58) [3]

Видимо, "аффтар" не учёл, что V включается в запись как ещё одно поле (для меня, признаюсь, тоже неожиданность). Из-за этого при включённом выравнивании I съезжает на 3 байта.
Вот так всё получается:

TIntDetail = record
  case Byte of
    1 : (I : integer);
    2 : (B1, B2, B3, B4 : Byte);
  end;



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

Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.44 MB
Время: 0.012 c
8-1121750641
ShotGun
2005-07-19 09:24
2005.12.25
Как прграммно изменить разрешение рисунка?


6-1126549480
oberon
2005-09-12 22:24
2005.12.25
проблема с xml запросом


4-1130398364
G-h-o-s-t
2005-10-27 11:32
2005.12.25
Возможно ли нажать неактивную кнопку в чужом приложении


5-1118908602
Tito
2005-06-16 11:56
2005.12.25
Наследование компонентов или класов


10-1110218999
#Alice
2005-03-07 21:09
2005.12.25
Как сделать toolbar для IE





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