Главная страница
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.025 c
4-1130414953
Rentgen
2005-10-27 16:09
2005.12.25
Как можно сменить программно пароль учетной записи (текущей)


9-1121961704
Conferno
2005-07-21 20:01
2005.12.25
Bump map - Specular Texture(GLScene)


14-1133804628
БарЛог
2005-12-05 20:43
2005.12.25
Вот... перевожу статью про ООП с английского...


14-1133422507
Ega23
2005-12-01 10:35
2005.12.25
С днем рождения! 1 декабря


2-1133885039
oleggar
2005-12-06 19:03
2005.12.25
быстрая запись