Форум: "Начинающим";
Текущий архив: 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.011 c