Проблемма с расходом памяти

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

Код: Выделить всё

type
  TShortInfo = record
    IsNew:string[1];
    Attribute:string[1];
    Size:string[12];
    DateTime:string[12];
    FileName:string[100];//????????Неизвестный размер
  end;

  TTree = class
  public
    DirName:string;
    Node:TTreeNode;
    Parent:TTree;
    SubDirs:array of TTree;
    Files:array of TShortInfo;
    constructor Create;
    destructor Destroy;override;
  end;
Если ставлю тип просто string, то Delphi принимает его как string[255] и на загрузку дерева уходит порядка 200Мб памяти. Если ставлю string[100] то порядка 70Мб, но встречаются более длинные имена. Как быть? Как можно еще описать? Если использовать другой тип, например, PChar, то у меня какие-то ошибки появляются, может я PChar в string потом неправильно преобразовываю.
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

для PChar надо не забыть память выделять
Изображение
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Можно представить массивом символов FileName: array of char; а там посмотреть что получиться...
[syntax=Delphi] [/syntax]
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

[quote="Duncon"]Можно представить массивом символов FileName: array of char]

напомни как в string и обратно преобразовать
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Код: Выделить всё

function strtoPchar(s:string):Pchar;
begin
  S := S+#0;
  result:=StrPCopy(@S[1], S) ;
end;

или 

pch:=PChar(str);
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

В Delphgi тип String по-умолчанию имеет размер 65525 символов
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

а я всегда думал что 255
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

нет, выделяемый по умолчанию размер 255, не нужно вводить в заблуждение,- типа стоит некоторым книжки почитать, а почему PChar советуем - так потому что он памяти меньше зажирает...
[syntax=Delphi] [/syntax]
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

На самом деле, давным давно в языке Pascal был тип String[N]. Значение N по умолчанию равнялось 255, так как внутренний формат представления String - LASCII, т.е. 1 байт на длину + массив Char-ов.

Delphi использует язык Object Pascal, в котором опрелделено 3 стандартных типа:
1) ShortString - аналог старого String
2) AnsiString - 2GB-ные ASCII строки (8-битные)
3) WideString - 2GB-ные UNICODE-строки

Идентификатор String в Object Pascal по умолчанию эквивалентен AnsiString, однако, для совместимости заставить компилятор интерпретировать String как ShortString (см директивы {$H–/+} и настройки компилятора (Project/Options))

Итак, скорее всего вы имеете дело с AnsiString. Разумеется 2GB не выделяется под переменную сразу. По формальным признакам выделяется столько, сколько нужно, но менеджер памяти видимо фрагментирует память (умышленно, чтобы не заниматься перераспределением памяти, если к строке прибавят несколько символов).

Есть еще тип OpenString, но его можно не брать в расчет вообще, он нужен только для совместимости, для вызова некоторых 16-разрядных функций WinAPI. (Если, скажем, Вы решите написать что-нибудь для Windows 3.11)

В Вашем случае, очевидно, не стоит полагаться на работу менеджера памяти с AnsiString....
AnsiString совместим с PChar настолько, что даже #0 в конце строки добавлять не надо.

Попробуйте использовать PChar(str), как советовал Duncon. Если результат останется прежним, то переделаем по-другому - будем выделять память из кучи ручками.
Blood_Magic
Сообщения: 273
Зарегистрирован: 30 июн 2005, 14:53

если просто заменить FileName:string[100]; на FileName:PChar;, то выдает ошибку, я так понял, GetMem использовать надо
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
Ответить