Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Внизvar xxx:String;??? Найти похожие ветки
← →
Usre (2002-09-08 23:34) [0]Есть ли тип переменной быстрее string ???
← →
Smiths (2002-09-08 23:40) [1]Типы переменных вообще-то в скорости не соревнуются :)
← →
Usre (2002-09-08 23:53) [2]А чем отличается string от WideString ?
← →
Malder (2002-09-09 00:05) [3]Тип Максимальная длина Используется для
ShortString 255 обратной совместимости
AnsiString 231 (2 Гб) символов ANSI
String или 255, или до 2 Гб символов ANSI или Unicode
WideString 230 (1 Гб) символов Unicode
Родовым является тип String, который имеет разный смысл в зависимости от директивы компилятора $H. Если включена директива {$H+} (она включена по умолчанию), то String интерпретируется компилятором как тип AnsiString - длинная строка с нулевым символом в конце. Если же включить директиву {$H-}, то String интерпретируется компилятором как тип ShortString - короткая строка без нулевого символа в конце. Если в объявлении типа после ключевого слова String следует число символов в квадратных скобках (например, String[4]), то, независимо от директив компилятора, тип трактуется как строка без нулевого символа в конце с указанным числом символов.
Со строками можно оперировать как с индексированными массивами символов. Например, S[i] - это символ, расположенный в строке в позиции i (индексы отсчитываются от 1, т.е. индекс 1 соответствует первому символу). Для строк типа ShortString или AnsiString выражение S[i] имеет тип AnsiChar, для строк типа WideString - WideChar.
← →
Старый паскалист (2002-09-09 00:40) [4]string тормозит из-за постоянной реаллокации его в памяти.
Напр., при
s := s + "aaaa";
старая память s будет освобождена, выделена новая на 4 байта
больше и туда помещён результат.
Соответственно, некоторыми ухищрениями этого можно избежать.
Напр., выделять память с помощью SetLength большими блоками и
вместо
s := "";
for i := 0 to Count-1 do
s := s + add_s[i];
писать (я написал из головы, могут быть ошибки. главное - идея)
SetLength(s, 1000);
TrueLengthOfS := 0; //Истиная длина строки - в которой хранится полезный текст
for i := 0 to Count-1 do
begin
if Length(s) < TrueLengthOfS + Length(add_s[i]) then
SetLength(s, TrueLengthOfS + Length(add_s[i]) + 1000)
Move(add_s[i][1], s[TrueLengthOfS+1], Length(add_s[i]));
// Корректируем полезную длину s
TrueLengthOfS := TrueLengthOfS + Length(add_s[i]);
end;
// Отбрасываем мусор
SetLength(s, TrueLengthOfS);
Таким образом, можно значительно уменьшить кол-во реаллокаций,
но зато усложнить код. Поэтому так поступать надо только в случае, когда это самое узкое место в быстродействии.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c