Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
7-91562
crushfm
2003-03-11 12:51
2003.04.28
Работа с системой


6-91421
FND
2003-02-25 01:42
2003.04.28
Срочно нужна помощь по ISAPI/NSAPI для получения файла по HTTP


1-91377
Term
2003-04-16 10:57
2003.04.28
Как сконвертить date(), в дату с четырьмя цифрами года т.е.


1-91399
Andrey_n
2003-04-16 15:18
2003.04.28
округление


14-91554
saNat
2003-04-11 19:22
2003.04.28
Программно включить компьютер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский