Текущий архив: 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 байт
← →
Anatoly Podgoretsky © (2003-04-11 15:47) [41]А что такое +
А взглятуть в хелпе, там хорошо рассмотрено, или на крайний слчай в книге если читать не умеешь.
← →
anbezr (2003-04-11 15:49) [42]Danilka © (11.04.03 15:28)
>а вот-это уже непонятки:
>var
> s:string[15];
>sizeOf(s) = 16 байт...
все правильно 15 байт на каждый символ + 1 на длину.
← →
Anatoly Podgoretsky © (2003-04-11 15:49) [43]Danilka © (11.04.03 15:47)
С чего ты взял, что паскаль тебе будет рассказывать про выравнивание, это не кго работа. Максимум ты можешь попросить на какую границцу выравнивать, но размер то ни на грам от этого не изменится, так что Паскаль тебя не обманывает, просто ты ему не доверяешь и напрсно.
← →
Danilka © (2003-04-11 15:50) [44]мне уже можно не отвечать...
← →
anbezr (2003-04-11 15:54) [45]Anatoly Podgoretsky © (11.04.03 15:47) к чему (кому) относится.
если ко мне, то я ничего не понял
← →
Anatoly Podgoretsky © (2003-04-11 15:56) [46]К тебе, а понять поосто, взгляни хоть раз в хелп
← →
anbezr (2003-04-11 16:04) [47]опять ничего не понял. это относится к сабжу?
← →
vuk © (2003-04-11 16:19) [48]Ещё не забывайте, что если объявляются строковые переменные в процедуре, то String живет в куче, а ShortString - в стэке.
← →
Mystic © (2003-04-11 16:43) [49]> а что такое счетчик ссылок.
При присваивании строк (AnsiString) никакого копирования не происходит, а увеличивается счетчик ссылок.
Например, после выполнения команд
S1 := "12345" + "67890";
S2 := S1;
И S1 и S2 будут указывать на одну и ту же строку в памяти, "1234567890" и счетчик ссылок будет равен 2. При присваивании
S2 := "12345"
счетчик ссылок строки "1234567890" уменьшится до 1, а строка S2 будет указывать на "12345", счетчик ссылок будет равен -1 ($FFFFFFFF), так как это константная строка, которая хранится в образе EXE-Файла.
Если теперь выполнить
S1 := ""
то у строка "1234567890" счетчик ссылок станет равным 0, и она удалится из памяти. Но мы этого делать не быдет, а выполним, к примеру
S2 := S1;
FillChar(S2[1], 3, "A");
В результате и строка (1), и строка (2) станут равны "AAA34567890". Для того, чтобы изменилась только строка S2, надо выполнить вставить перед FillChar
UniqueString(S2);
после чего S2 будет указывать на уникальную строку "1234567890" (счетчик ссылок равен 1), а S1 будет указывать на другую строку "1234567890" (счетчик ссылок также равен нулю).
> Danilka © (11.04.03 15:47)
Я имел в виду тип AnsiString, обычно обозначаемый просто через string.
← →
anbezr (2003-04-11 16:56) [50]!!! класс !!!
Спасибо!
Страницы: 1 2 вся ветка
Текущий архив: 2003.04.28;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.024 c