Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.085 c
14-1133603681
Хинт
2005-12-03 12:54
2005.12.25
Помогите разобраться с CALL


2-1133946451
john_mag
2005-12-07 12:07
2005.12.25
MessageDlg


14-1133338697
блин
2005-11-30 11:18
2005.12.25
Авторские права


14-1133622497
Piter
2005-12-03 18:08
2005.12.25
Ну блин, долбанный дос, долбанные программисты


2-1134022118
Sung
2005-12-08 09:08
2005.12.25
Русские буквы в консольном приложении