Народ подскажите пожалуйста как точно строки делфи храняться в памяти...
я знаю что если в процедуре задаешь переменную типа стринг:
procedeure MyProc;
var
S: String;
begin
...
end;
то в стеке будет 4-х байтный указатель (сначала нулевой), при первом использовании выделится память под строку
и они очевидно динамически будет увеличиваться во время работы со строкой. Во время своих экспериментов я обранужил, что строка хранится необыяным образом. Во первых, она всегда с нулевым символом на конце (ну это понятно
для совместимости), а во вторый, перед самой строкой содержаться 2-е четырехбайтные служебные переменные. первая — размер строки, а вот вторая меня и интересует.
Я покапался в служебных библиотечках и узнал, что она проверяется на 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>>
Здравствуйте, 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".
Если вещь не годна для одной цели, ее можно употребить для другой. // Лао цзы
Здравствуйте, zag2art, Вы писали:
Z>Народ подскажите пожалуйста как точно строки делфи храняться в памяти...
Как раз искал недавно:
http://www.sources.ru/magazine/0804/delphistr.html