Главная страница
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.046 c
2-1133784476
Mothertrucker
2005-12-05 15:07
2005.12.25
Большоооой текст!


2-1133937740
Sung
2005-12-07 09:42
2005.12.25
Большие массивы


14-1133039450
Алекскндр
2005-11-27 00:10
2005.12.25
Книги по Delphi - Посоветуйте


2-1134140482
Goast
2005-12-09 18:01
2005.12.25
Игнор ошибки!!!


2-1133794086
Витёк####
2005-12-05 17:48
2005.12.25
путь к dll