Модератор: Модераторы
writeln('Str - ', pointer(PChar(@Str) + 1));
shortstring нужна всегда, с ней проще, и она быстрее работает.
Can't read or write variables of this type
{$coperators+} // +=
{$modeswitch result+} // result в функциях
{$h+} // string = ansistring
function HexDump(const s: string): string;
var
bytes: PByte;
i: integer;
begin
result := '';
bytes := pointer(s);
for i := 0 to length(s) * sizeof(s[1]) - 1 do
result += HexStr(bytes[i], 2) + ' ';
end;
writeln(HexDump('hello')); // => 68 65 6C 6C 6F
Pasha-V писал(а):Извиняюсь, нужно именно shortstring. Как-то можно посмотреть область памяти, где она лежит?
Главное преимущество строк типа AnsiString по сравнению с короткими строками — отсутствие каких-либо ограничений на длину обрабатываемых данных. Но это преимущество имеет и обратную сторону медали — работа с динамически выделяемой памятью сопряжена со значительными накладными расходами. Как только переменной такого типа присваивается очередное значение, имеющее длину, отличную от длины предыдущего значения, приходится возвращать ранее занимаемый ресурс и выделять место под новое значение переменной. Это неизбежно приводит к появлению разрозненных освобожденных участков памяти, выполнению дополнительных работ по "уборке мусора" и, как следствие, к замедлению работы программы.
var
P: ^string;
S: string;
begin
S := 'World';
zub писал(а):сегодня он +1, завтра -1, а в четверг +8
zub писал(а):@Str[1]
Pasha-V писал(а):Простой пример — сортировка динамического и статического массивов. Динамический медленнее на 40%.
Pasha-V писал(а):работа с динамически выделяемой памятью сопряжена со значительными накладными расходами
Уж не знаю, как ты получил этот результат
uses
sysutils, dateutils;
const
Len = 16000000; // длина массива случайных чисел
Ran = 16000000; // диапазон случайных чисел
type
TStat = array[1..Len] of longword;
TDyn = array of longword;
PStat = ^TStat;
procedure JotMess;
var
w: longword;
begin
assign(stdout, 'C:\Mess.txt');
rewrite(stdout);
randomize;
for w := 1 to Len do
write(stdout, random(Ran) + 1, ' ');
close(stdout);
end;
procedure Make(stat: PStat; dyn: TDyn; s: char);
var
w: longword;
begin
assign(input, 'C:\Mess.txt');
reset(input);
if s = 'S' then
for w := 1 to Len do
read(stat^[w], s)
else
for w := 0 to Len - 1 do
read(dyn[w], s);
end;
procedure CSort(arr: PStat);
var
b: array[1..Ran + 1] of byte;
i, j, k: longword;
begin
fillbyte(b, Ran + 1, 0);
for i := 1 to Len do
inc(b[arr^[i]]);
k := 1;
for j := 1 to Ran + 1 do
for i := 1 to b[j] do
begin
arr^[k] := j;
inc(k);
end;
end;
procedure CSort(arr: TDyn);
var
b: array of byte;
i, j, k: longint;
begin
setlength(b, Ran + 1);
for i := 0 to Len - 1 do
inc(b[arr[i]]);
k := 0;
for j := 0 to Ran do
for i := 0 to b[j] - 1 do
begin
arr[k] := j;
inc(k);
end;
end;
procedure Jot(stat: PStat; dyn: TDyn; a: char);
var
w: longword;
begin
assign(stdout, 'C:\' + a + '.txt');
rewrite(stdout);
if a = 'S' then
for w := 1 to Len do
write(stdout, stat^[w], ' ')
else
for w := 0 to Len - 1 do
write(stdout, dyn[w], ' ');
close(stdout);
end;
var
Stat: PStat;
Dyn: TDyn;
First: tdatetime;
begin
JotMess;
new(Stat);
Make(Stat, Dyn, 'S');
First := now;
CSort(Stat);
writeln('Stat: ', millisecondsbetween(First, now));
Jot(Stat, Dyn, 'S');
dispose(Stat);
setlength(Dyn, Len);
Make(Stat, Dyn, 'D');
First := now;
CSort(Dyn);
writeln('Dyn: ', millisecondsbetween(First, now));
Jot(Stat, Dyn, 'D');
finalize(Dyn);
end.
Pasha-V писал(а):Можешь сам проверить.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1