![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Условное описание [D7]
Sung © (2005-12-07 09:53:00)В книге С. Бобровского "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.
Теперь я вообще ничего не понимаю. То ли я что-то не так сделал, то ли это такая хитрая оптимизация компилятора. Объясните, пожалуйста.
Sapersky (2005-12-07 13:58:00) [1]Видимо, "аффтар" не учёл, что V включается в запись как ещё одно поле (для меня, признаюсь, тоже неожиданность). Из-за этого при включённом выравнивании I съезжает на 3 байта.
Вот так всё получается:
TIntDetail = record
case Byte of
1 : (I : integer);
2 : (B1, B2, B3, B4 : Byte);
end;
Sung (2005-12-07 10:24:00) [2]Вот спасибо. Все понял.
MBo (2005-12-07 10:03:00) [3]попробуй так:
TIntDetail = packedrecord
заодно посмотри SizeOf(ID) при упакованной записи и без packed
кроме того, изучи влияние директивы компилятора {$A} (без packed)