![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Насколько адекватен SizeOf
Sha © (2008-06-05 16:25:00)Моя Delphi7 выводит 1 2 4 8 16 16 16 16 в качестве размеров структур, имеющих размер 1, 2, 4, 8, 9, 10, 12, 16 байт.
Также замечено неадекватное поведение и для структур большего размера.
Интересны результаты для других версий Delphi.
Тестилось на этом коде
type
t1 = record
b: byte;
end;
t2 = record
w: word;
end;
t4 = record
d: dword;
end;
t8 = record
i: int64;
end;
t9 = record
i: int64;
b: byte;
end;
t10 = record
i: int64;
w: word;
end;
t12 = record
i: int64;
d: dword;
end;
t16 = record
i: int64;
i2: int64;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:=Format('%d %d %d %d %d %d %d %d',
[SizeOf(t1), SizeOf(t2), SizeOf(t4), SizeOf(t8),
SizeOf(t9), SizeOf(t10), SizeOf(t12), SizeOf(t16)]);
end;
Anatoly Podgoretsky (2008-06-05 17:07:00) [61]> Sha (05.06.2008 16:52:13) [13]
Не знаю, никогда не заморачивался этой проблемой.
Но Packed всегда работал ожидаемо.
Sha (2008-06-05 17:06:00) [62]> Anatoly Podgoretsky © (05.06.08 16:55) [15]
> А как ты это представляешь, выравнивание без изменения размера?
Не понял
Sha (2008-06-05 17:05:00) [63]> Palladin © (05.06.08 16:53) [14]
> ну, я думаю это что то не реальное. у меня стабильно у packed 44. как воспроизвести?
Ты под другими звездами :)
У нас проект большой.
Похоже дело в том, что описание типа и
егo использование в разных модулях.
Последовательность дейсвий такая.
Убираем packed, билдим проект, получаем 48
Ставим packed, компилируем, получаем 48
Билдим, получаем 44
Anatoly Podgoretsky (2008-06-05 16:55:00) [64]> Sha (05.06.2008 16:30:02) [2]
А как ты это представляешь, выравнивание без изменения размера?
Palladin (2008-06-05 16:53:00) [65]
> Sha © (05.06.08 16:49) [10]
ну, я думаю это что то не реальное. у меня стабильно у packed 44. как воспроизвести?
Sha (2008-06-05 16:52:00) [66]> Anatoly Podgoretsky © (05.06.08 16:49) [11]
Тут не стоит вопрос как обойти проблему и получить адекватность,
это я знаю.
Вопрос в том, есть этот глюк в новых версиях Дельфи
Sha (2008-06-05 16:51:00) [67]> Palladin © (05.06.08 16:46) [8]
> move вообще опасно применять к не packed записям
и как показывает пост [10] и к Packed тоже
Anatoly Podgoretsky (2008-06-05 16:49:00) [68]> Sha (05.06.2008 16:25:00) [0]
Кстати если тебе нужна адекватность, то используй слово Packed
Sha (2008-06-05 16:49:00) [69]> Плохиш © (05.06.08 16:43) [7]
С чего все началось. Было замечено , что тип t44 независио от packed, но в зависимости от расположения звезд на небе имеет размер 44 или 48 байт
t44 = record
i1: int64;
i2: int64;
i3: int64;
i4: int64;
d1: dword;
d2: dword;
d3: dword;
end;
Anatoly Podgoretsky (2008-06-05 16:48:00) [70]> Sha (05.06.2008 16:25:00) [0]
В чем неадекватность, и наверно твое представление не совпадает с представлением компилятора, а понять его не всегда легко.
Palladin (2008-06-05 16:46:00) [71]1. по видимому, компилятор воспринимает запись из одного поля, как просто тип этого поля
2. move вообще опасно применять к не packed записям, программист всегда должен иметь ввиду, что размер записи может не совпадать, не то чтобы с суммой размеров полей, но и быть разным даже в зависимости от директив и настроек компилятора.
Плохиш (2008-06-05 16:43:00) [72]
> Про выравнивание все ясно, и что размер записи зависит от
> выранивания тоже ясно.
> Только неясно, почему t1 имеет размер 1 байт, а t5- 8.
Хм, решил мне телепатор сломать, не выйдет...
Плохиш (2008-06-05 16:41:00) [73]
> Sha © (05.06.08 16:25)
> Моя Delphi7 выводит 1 2 4 8 16 16 16 16 в качестве размеров
> структур, имеющих размер 1, 2, 4, 8, 9, 10, 12, 16 байт.
Пишиpacked recordи получишь желаемые цифры.
Sha (2008-06-05 16:39:00) [74]> Palladin © (05.06.08 16:31) [3]
Про выравнивание все ясно, и что размер записи зависит от выранивания тоже ясно.
Только неясно, почему t1 имеет размер 1 байт, а t5 - 8.
Это может примести к ошибкам в операторах типа
Move(r1,abc,SizeOf(t1)); //тут скопируется 1 байт
Move(r5,abc,SizeOf(t5)); //тут скопируется 8 байт, а не 5, как ожидаю я
Palladin (2008-06-05 16:37:00) [75]а так же от расположения полей
Type
TRec1=Record
a:Int64;
b:Byte;
c:Integer;
d:Byte;
End;
TRec2=Record
a:Int64;
b:Byte;
d:Byte;
c:Integer;
End;
абсолютно разные SizeOf, если немного поэкспериментировать, можно выявить как компилятор упаковывает поля записи и как влияет на упаковку директива {$A}
Palladin (2008-06-05 16:31:00) [76]
> Sha © (05.06.08 16:30) [2]
а размер записи напрямую зависит от выравнивания
Sha (2008-06-05 16:30:00) [77]> Palladin © (05.06.08 16:28) [1]
я не спрашивал про выравнивание
Palladin (2008-06-05 16:28:00) [78]с месяца два я распинался уже в "прочее" про выравниванивание полей в структурах... поди уже в архиве...
> Также замечено неадекватное поведение и для структур большего
> размера.
оно вполне адекватное... приводи, обосную :)