Форум: "Потрепаться";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
ВнизЯвляется ли 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.011 c