Модератор: Модераторы
sign писал(а):Закладываясь на постоянство указателя в памяти, вы закладываете мину в свою программу.
zub писал(а): не храните адрес элемента, храните его индекс и всё будет ОК
var
Strings: array of PChar; // массив с указателями на начало строки в хранилище
Storage: array of Byte; // хранилище строк
s: String;
i: Integer;
...
begin
...
s := Strings[i]; // получение строки по ее номеру
...
var
Strings: array of Integer; // массив с индексами на начало строки в хранилище
Storage: array of Byte; // хранилище строк
s: String;
i: Integer;
...
begin
...
s := PChar(@Storage[Strings[i]]); // получение строки по ее номеру
...
Mirage писал(а):Я так понял, что данные строк почему-то хранятся в каком-то куске памяти, вместо того, чтобы просто управляться менеджером памяти.
Strings[i] := StrNew(PChar(S));
Strings[i] := @Storage[StoragePos];
CopyMemory(Strings[i], PChar(S), Length(S)+1);
Inc(StoragePos, Length(S)+1);
Strings[i] := StoragePos;
CopyMemory(@Storage[StoragePos], PChar(S), Length(S)+1);
Inc(StoragePos, Length(S)+1);
Mirage писал(а):В этом случае, у этого самого Storage возникает нетривиальная логика, которая до этого выполнялась менеджером памяти, и которую логично инкапсулировать в классе.
SeZuka писал(а):Создание массива с сортировкой занимает примерно треть от всего объема алгоритма.
SeZuka писал(а):То есть заменив тысячи выделений маленьких кусочков памяти под каждую строку, на один большой кусок где строки лежат друг за другом, получили уменьшение времени работы всего алгоритма в разы!
Vapaamies писал(а):Двоичные деревья именно для этого и придумали.
Mirage писал(а):Странно это. Какой менеджер памяти используется?
Mirage писал(а):либо алгоритм больше ничего не делает, кроме выделения памяти
Mirage писал(а):Память можно вообще не выделять, а замапить файл в память.
Mirage писал(а):Но нетривиальная логика у такого менеджера таки имеется, т.к. без оной решение не работает, о чем, собственно, топик.
Mirage писал(а):Можно, кстати, хранить относительные указатели, тогда при выдаче строки можно просто сложить адрес массива-хранилища и относительный указатель.
debi12345 писал(а):Хм... А когда происходит ресайзинг массива (инвалидирующий шифты от начала массива )? В отдельном треде пареллельно работе алгоритма ?
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2