![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сколько байт достаточно для хранения длины строки?
AlexanderMS © (2007-11-05 06:49:00)В моём случае длина каждой строки редко переваливает даже за 255. В файл записываю по привычке (плохая привычка, ИМХО), её длину в 4 байта (
integer). Тут пришла мысль, что нерационально использую дисковое пространство, и подумал ограничиться двумя байтами (word). Но вспомнил, что компьютер работает с регистрами в 4 байта, и возник вопрос: как это скажется на времени выполнения всей процедуры чтения? Строк в файле может быть достаточно много.
Попутный вопрос: почему свойстаCountу везде Integer(а неcardinal/dword), хотя количество элементов не может быть отрицательным?
AlexanderMS (2007-11-05 08:59:00) [41]Большое всем спасибо. Всё понял.
Но если использовать Integer и файл "битый", то SetLength(S, Очень большое число) даст большое зависание, которое я не знаю, как ловить.
Anatoly Podgoretsky (2007-11-05 08:55:00) [42]
> (разве что изменится механизм адресации, но это вряд ли).
Так он давно изменен, пользовательским программам в ОС можно выделять не 2 гб, а 3 - но Борланд на это не отрегировал.
Anatoly Podgoretsky (2007-11-05 08:51:00) [43]
> Cardinal, в отличие от DWORD, такойже generic-тип, как и
> Integer
Так и DWORD тоже.
Неисповедимы пути Борланда с Cardinal
Однокамушкин (2007-11-05 08:23:00) [44]
> Юрий Зотов © (05.11.07 07:15) [3]
> Потому что мудр и дальновиден дядька Борланд. Integer -
> это generic тип, так что код останется рабочим и при переходе
> на другую разрядность.
Cardinal, в отличие от DWORD, такойже generic-тип, как и Integer
Тут дело в другом... В ранних версиях Delphi Cardinal был недоделанным, его диапазон был от 0 до 2147483647 (т.е. совпадал с беззнаковой половиной диапазона Integer), а старший бит не использовался... Уж не знаю, почему так было сделано, но исправлено это было, кажется, только в Delphi 4, а до этого никто Cardinal-ом не пользовался, потому что смысла не было, вот и сложилось исторически, что во всех библиотеках везде Integer
Однокамушкин (2007-11-05 08:04:00) [45]
> почему свойста Count у везде Integer
Потому что с беззнаковым Count можно огрести кучу проблем вот в таком часто встречающемся цикле:
var
I: Cardinal;
for I := 0 to Count - 1 do
...
Если вдруг окажется, что Count = 0, то выражение Count - 1 даст в зависимости от настроек компилятора либо ошибку времени выполнения Range check error, либо 4294967295, и цикл пойдёт молотить 4294967296 итераций, гуляя по несуществующим элементам
> как это скажется на времени выполнения всей процедуры чтения?
По сравнению с временем чтения с диска время любой операции с регистрами - исчезающе малая величина... Но экономить два байта на диске при нынешних их объёмах - это уже из области извращений
Юрий Зотов (2007-11-05 07:15:00) [46]> почему свойста Count у везде Integer
Потому что мудр и дальновиден дядька Борланд. Integer - это generic тип, так что код останется рабочим и при переходе на другую разрядность. С другой стороны, даже если каждый элемент списка имеет минимально возможный размер (1 байт), то их количество все равно не может превысить Max(Integer) (разве что изменится механизм адресации, но это вряд ли).
Джо (2007-11-05 07:04:00) [47]> и возник вопрос: как это скажется на времени выполнения
> всей процедуры чтения?
Практика — критерий истины. То есть, я хочу сказать, что, потратив от силы 20 минут на написание тестового кода, вы получите *практический* ответ на ваш вопрос.
> Попутный вопрос: почему свойста Count у везде Integer (а
> не cardinal/dword), хотя количество элементов не может быть
> отрицательным?
В стандарте языка Делфи максимальная длина строки — 2 Гб, а не 4, поэтому Cardinal здесь никак не подходит.
И, второе, «свойства Count» вовсем не «везде» типа Integer. Ничто не мешает им быть хоть Int64. Как например, свойство Size у TStream.
homm (2007-11-05 06:54:00) [48]> [0] AlexanderMS © (05.11.07 06:49)
> как это скажется на времени выполнения всей процедуры чтения?
Никак не скажется. Дисковая система работает в тысячи раз медленнее, нежели регистры процессора.