Стоки в памяти
От: zag2art  
Дата: 06.11.05 07:28
Оценка:
Народ подскажите пожалуйста как точно строки делфи храняться в памяти...
я знаю что если в процедуре задаешь переменную типа стринг:
procedeure MyProc;
var
  S: String;

begin
  ...
end;

то в стеке будет 4-х байтный указатель (сначала нулевой), при первом использовании выделится память под строку
и они очевидно динамически будет увеличиваться во время работы со строкой. Во время своих экспериментов я обранужил, что строка хранится необыяным образом. Во первых, она всегда с нулевым символом на конце (ну это понятно
для совместимости), а во вторый, перед самой строкой содержаться 2-е четырехбайтные служебные переменные. первая — размер строки, а вот вторая меня и интересует.
Я покапался в служебных библиотечках и узнал, что она проверяется на 1, больше я ничего не узнал...
Подскажите кто знает точно, что там с этой второй переменной....
Re: Стоки в памяти
От: _spin_ Россия  
Дата: 06.11.05 07:53
Оценка: -1
Здравствуйте, zag2art, Вы писали:

Z>и они очевидно динамически будет увеличиваться во время работы со строкой. Во время своих экспериментов я обранужил, что строка хранится необыяным образом. Во первых, она всегда с нулевым символом на конце (ну это понятно

Z>для совместимости), а во вторый, перед самой строкой содержаться 2-е четырехбайтные служебные переменные. первая — размер строки, а вот вторая меня и интересует.
Z>Я покапался в служебных библиотечках и узнал, что она проверяется на 1, больше я ничего не узнал...
Z>Подскажите кто знает точно, что там с этой второй переменной....

Насколько я помню, обе эти служебные переменные определяют размер строки. Просто если вторая переменная не равнв нулю, то это признак WideString и используется обе переменные для определения размера.

procedure TfrmMain.Button4Click(Sender: TObject);
var
  s : string;
  ws : WideString;
begin
  s := 'simple string'; // BPX here
  ws := 'wide string';
  ShowMessage(s);
  ShowMessage(ws);
end;


на трассировке по процессору видно что и как, в общем-то.
... <<#4 — 05 Mambana No reason>>
Не восхрапи на работе, ибо храпом своим разбудишь начальника своего.
Re: Стоки в памяти
От: SeLarin Россия http://selarin.livejournal.com
Дата: 06.11.05 08:24
Оценка:
Здравствуйте, zag2art, Вы писали:

Z>Народ подскажите пожалуйста как точно строки делфи храняться в памяти...


Читаем справочку по Delphi:

A long-string variable is a pointer occupying four bytes of memory. When the variable is empty — that is, when it contains a zero-length string — the pointer is nil and the string uses no additional storage. When the variable is nonempty, it points a dynamically allocated block of memory that contains the string value. The eight bytes before the location contain a 32-bit length indicator and a 32-bit reference count. This memory is allocated on the heap, but its management is entirely automatic and requires no user code.


И по-русски (первод — авторский )

Переменная типа "длинная строка" — это указатель, занимающий в памяти четыре байта. Когда переменная пуста, т.е. содержит строку нулевой длины, указатель равен nil и строка не использует дополнительного места. Когда переменная не пуста, она указывает на динамически выделенный блок памяти, который содержит значение строки. Восемь байт перед строкой занимают 32-битный индикатор длины и 32-битный счётчик ссылок (курсив мой, SeLarin). Эта память выделяется в куче, но управление ей полностью автоматическое и не требует от программиста никакого дополнительно кода.


Подробности смотри в справке Delphi, в статье "Long strings".


Если вещь не годна для одной цели, ее можно употребить для другой. // Лао цзы
Re: Стоки в памяти
От: _Michael_V_  
Дата: 06.11.05 13:35
Оценка:
Здравствуйте, zag2art, Вы писали:

Z>Народ подскажите пожалуйста как точно строки делфи храняться в памяти...


Как раз искал недавно:

http://www.sources.ru/magazine/0804/delphistr.html
Re[2]: Стоки в памяти
От: zag2art  
Дата: 07.11.05 09:47
Оценка:
Здравствуйте, _Michael_V_, очень помогло...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.