Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сколько байт достаточно для хранения длины строки?


Страницы:   1 2 3

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)
> как это скажется на времени выполнения всей процедуры чтения?

Никак не скажется. Дисковая система работает в тысячи раз медленнее, нежели регистры процессора.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо