Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.28;
Скачать: CL | DM;

Вниз

Является ли string динамическим массивом   Найти похожие ветки 

 
anbezr   (2003-04-11 12:38) [0]

верно ли утверждение, что
var s: string;
...
s := "12";
занимает в памяти места меньше, чем
var s: shortstring;
...
s := "12";


 
Игорь Шевченко ©   (2003-04-11 12:56) [1]

Нет


 
anbezr   (2003-04-11 13:33) [2]

очень жаль


 
Sergey Masloff   (2003-04-11 13:36) [3]

var s : String;
занимает:
4 байта счетчик ссылок + 4 байта длина строки + число байт самой строки + 4 байта завершающий null. Счетчик ссылок и длина записаны перед строкой но это недокументировано закладываться на это не стоит.

var s : ShortString;
занимает длина строки + 1 байт


 
anbezr   (2003-04-11 13:46) [4]

да но ведь где-то было написано, что shortstring = array[0..255] of char, т.е. размер массива всегда 256 байт


 
Sergey Masloff   (2003-04-11 13:49) [5]

anbezr (11.04.03 13:46)
>да но ведь где-то было написано,
А так не пробовал:
var s : String[2];
тоже 256 ? ;-)))


 
anbezr   (2003-04-11 13:52) [6]

но короткая строка - это всегда 256, т.к. статический массив?следственно, string, при условии короткости строк, менее ресурсоемкий тип?
к стати, а что такое счетчик ссылок?


 
NAlexey ©   (2003-04-11 13:56) [7]

Если не секрет почему у тебя вопрос касается ресурсоёмкости?


 
y-soft ©   (2003-04-11 13:57) [8]

Вообще-то не стоит забывать про директивы {$H+} и {$H-}
String не всегда эквивалентна AnsiString, хотя по умолчанию это так...


 
anbezr   (2003-04-11 14:04) [9]

NAlexey © (11.04.03 13:56)
>Если не секрет почему у тебя вопрос касается ресурсоёмкости?

не секрет, памяти маловато, а приложение может включать в себя сотни три потомков объектя, одним из полей которого является или string или shortstring


 
NAlexey ©   (2003-04-11 14:08) [10]

Ну если ты заботишся о величине String и тебе извесна длина этой самой String то делай SetLength что возможно и принесет некоторое облегчение:)


 
Игорь Шевченко ©   (2003-04-11 14:09) [11]

anbezr (11.04.03 14:04)
> памяти маловато, а приложение может включать в себя сотни
> три потомков объектя, одним из полей которого является или
> string или shortstring


Пусть тебя это не волнует


 
y-soft ©   (2003-04-11 14:10) [12]

Обычно в таких случаях жертвуют быстродействием и грузят строки только тогда, когда они становятся непосредственно нужны, а потом сразу же освобождают память


 
anbezr   (2003-04-11 14:11) [13]

Игорь Шевченко © (11.04.03 14:09)
>Пусть тебя это не волнует
был бы признателен, если объяснишь почему


 
Danilka ©   (2003-04-11 14:15) [14]

anbezr (11.04.03 13:46)
можно в дельфи написать shortstring и нажать F1
В результате откроется окошко с помощью в котором будет написано:
Type Maximum length Memory required
ShortString 255 characters 2 to 256 bytes
AnsiString ~2^31 characters 4 bytes to 2GB
WideString ~2^30 characters 4 bytes to 2GB

неужели это так сложно, нажать F1?


 
anbezr   (2003-04-11 14:24) [15]

Danilka © (11.04.03 14:15)

в приведенном тобой фрагменте нет ссылки на то, является ли string и shortstring динамическими.
дополняя твое высказывание:
>неужели это так сложно, нажать F1?
скажу, что неплохо бы еще понимать на чем :)


 
Sergey Masloff   (2003-04-11 14:24) [16]

Danilka ©
>AnsiString ~2^31 characters 4 bytes to 2GB
>WideString ~2^30 characters 4 bytes to 2GB
Говорю же - минимум 8 байт расходуется на пустую строку. Хотя... ну под саму переменную (указатель) расходуется 4 байта, это наверное имеется в виду...


 
y-soft ©   (2003-04-11 14:24) [17]

>Danilka © (11.04.03 14:15)

А вдруг все 300 строк максимального размера? :))


 
anbezr   (2003-04-11 14:33) [18]

y-soft © (11.04.03 14:24)
размер строки (количество символов) может колебаться от 2 до 255, но все-таки не хотелось бы тратить 256 байт там, где можно обойтись 60+8, например


 
Игорь Шевченко ©   (2003-04-11 14:43) [19]

anbezr (11.04.03 14:11)

Потому что "Памяти маловато" не подходит в качестве критерия оценки для "сотни три потомков" объекта со строками. Виртуальная память, с которой вся работа происходит, ограничивается размером жесткого диска, а его объема для "сотен трех потомков" хватает за глаза и больше.


 
y-soft ©   (2003-04-11 14:44) [20]

>anbezr (11.04.03 14:33)

Можно было бы Вас понять, если бы Вы писали для i8051, но на современном железе IMHO такая экономия ни к чему. В том же хелпе написано: ShortString ... backward compatibility
Т.е. тип используется для совместимости с D1, и нет никакой гарантии, что будет использоваться в следующих версиях.

Бывают, конечно, случаи, когда грузить все, что возможно, в ОЗУ становится накладно, но тогда применяют динамическую загрузку. Не стоит также забывать, что часто выбор типа сильно влияет на быстродействие. Так что всегда надо считать...


 
panov ©   (2003-04-11 14:48) [21]

>В том же хелпе написано: ShortString ... backward compatibility

Но очень удобно использовать ShortString для написания DLL -)


 
Danilka ©   (2003-04-11 14:51) [22]

anbezr (11.04.03 14:33)
Извиняйте за грубые слова, но очень холчется покричать и поругаться.

АААААААААААААААА
БЛИН!!!
С КАКИХ ЭТО ПОР, Memory required ПЕРЕВОДИТСЯ НЕ КАК ТРЕБУЕТСЯ ПАМЯТИ, а как "количество символов может колебаться"?????


 
y-soft ©   (2003-04-11 14:53) [23]

>panov © (11.04.03 14:48)

IMHO для Dll и c AnsiString ненужные головняки:)


 
anbezr   (2003-04-11 14:54) [24]

задача, да, специфическая. мое оборудование - контроллер со 128 метрами HDD, 128 метрами RAM, работающий под XP Embedded, которая отжирает 70 метров с винта, и пока не знаю сколько, с RAM. поэтому хочется снизить ресурсопотребление моей прогой. вот и задумался о строках, как о дин. массивах. в общем буду оптимизить не переходом от одного представления данных к другому, а изменением алгоритмов


 
y-soft ©   (2003-04-11 14:58) [25]

>anbezr (11.04.03 14:54)

Вот это уже правильный подход. Embedded системы требуют тщательного расчета и специфических приемов программирования


 
Игорь Шевченко ©   (2003-04-11 14:59) [26]

anbezr (11.04.03 14:54)

С этого надо начинать, однако


 
anbezr   (2003-04-11 15:08) [27]

Danilka © (11.04.03 14:51)

побереги(те) нервы.
я задал вопрос потому, что я не знаю, как понимать:
ShortString 255 characters 2 to 256 bytes
AnsiString ~2^31 characters 4 bytes to 2GB
т.е., я предположил, что:
var s: shortstring[2] займет в памяти 3 байта, и что бы я не делал типа:
s := ""; s := "1"; s := "12" - ВСЁ РАВНО ТРИ БАЙТА.
а вот если
var s: string займет в памяти 8 байта, и
s := "" - 8 байт
s := "1"; - 8+1 байт
s:="12" - 8+1 байт.



 
anbezr   (2003-04-11 15:11) [28]

anbezr (11.04.03 15:08)
опечатка!
s:="12" - 8+1 байт.
следует читать как:
s:="12" - 8+2 байт.


 
Sergey Masloff   (2003-04-11 15:14) [29]

>var s: shortstring[2] займет в памяти 3 байта
не совсем. Ты забываешь про выравнивание по границам (двойных, учетверенных) слов.


 
anbezr   (2003-04-11 15:23) [30]

возможно, если включен к-л ключ, но по умолчанию - байт на символ + 1 на длину. проверял.


 
anbezr   (2003-04-11 15:27) [31]

к стати, нажал F1 на {$H} и увидел там ответ на свой вопрос :)
... can represent either a long, dynamically-allocated string (the fundamental type AnsiString) or a short, statically-allocated string (the fundamental type ShortString)
очень странно, что dynamically-allocated и statically-allocated не фигурируют в описании строковых типов.


 
Danilka ©   (2003-04-11 15:28) [32]

сорри, беру все свои слова обратно.
сделал вот-так:
sizeOf(shortstring) = 256 байтов
sizeOf(string) = 4 байта.

а вот-это уже непонятки:
var
s:string[15];
sizeOf(s) = 16 байт...

короче, не верь тому, что в документации написано... :(((


 
y-soft ©   (2003-04-11 15:30) [33]

>anbezr (11.04.03 15:27)

F1 - великая сила!:))


 
Mystic ©   (2003-04-11 15:34) [34]

>памяти маловато, а приложение может включать в себя сотни три потомков объектя

1. Пусть длина строки составляет 256 байт
256 * 300 = 75 Кб памяти
75 Кб / 128 Мб = 0.05%

2. ShortString --- устаревший тип. Что заставляет ее использовать? Теоретически использование обычного string несколько снижает затраты памяти, но несколько неудобен при операциях чтения/записи в файл (если он входит в состав записи).



 
Anatoly Podgoretsky ©   (2003-04-11 15:34) [35]

anbezr (11.04.03 15:08)
Абсолютно неверные цифры: 4,17..2гб
а про выравнивание тебе уже сказали.
Но по сути вопроса, AnsiString можно считать динамическим массивом символов, кроме того сами динамические массивы имеют индетичную структуру и только чуть чуть отличаются в работе.

Не там за размер борешься!


 
anbezr   (2003-04-11 15:42) [36]

2 Mystic © (11.04.03 15:34)

теперь - ничто.

2 Anatoly Podgoretsky © (11.04.03 15:34)

да, но я и интересовался тем, какие строки динамические.
shortstring не выровнена - идет байт за байтом.


 
Mystic ©   (2003-04-11 15:42) [37]

> sizeOf(string) = 4 байта.
string это указатель. Так что теоретически тип string занимает
4 байта - указатель,
4 байта -счетчик ссылок,
4 байта - длина строки,
1 байт - завершающий символ #0,
+ выравнивание на границу 4-х байт


 
Mystic ©   (2003-04-11 15:44) [38]

Да, забыл еще 4 байта на размер выделенного блока памяти и флаги :)


 
anbezr   (2003-04-11 15:45) [39]

Mystic © (11.04.03 15:42)

спасибо, полное понимание.
а что такое счетчик ссылок.


 
Danilka ©   (2003-04-11 15:47) [40]

Mystic © (11.04.03 15:42)
да, но почему тогда:

var
s1:string[5];
s2:string[10];
s3:string[20];

sizeOf(s1) = 6 байт
sizeOf(s1) = 11 байт
sizeOf(s1) = 21 байт



Страницы: 1 2 вся ветка

Текущий архив: 2003.04.28;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.017 c
3-91236
Beginer
2003-04-11 09:33
2003.04.28
создание таблицы MSAccess


3-91179
mama
2003-04-09 16:05
2003.04.28
Delphi6, Paradox, BDE,


6-91429
ole
2003-03-04 05:06
2003.04.28
Проблема: Поток обрабатывающий одно подключение в TServerSocket


8-91413
Сергей
2003-01-25 13:35
2003.04.28
Работа с картинками


1-91323
Брат
2003-04-15 14:53
2003.04.28
Мастера посмотрите плиз на эту строку и скажите что здесь неверно