контейнерам итераторы в виде классов?
Можешь сделать record, но сильно лучше не будет У контейнеров может быть несколько итераторов, кстати (таблица состоит из строк, столбцов, клеток, и перебирать можно в разные стороны и с разными фильтрами) Вот чего не хватает, это генериков, чтобы не приходилось бойлер писать, именованные функции... Написать бы просто function GetEnumerator<type1>: iEnumerable<type1>; function GetEnumerator<type2>: RecordEnum<type2>;
меня напрягает лишнее ненужное выделение памяти при попытке получить доступ на запись к содержимому например TDictionary
Не выделяй. Сделай интерфейс и синглтон. ...а потом разгребай когда по нему пойдут вложенные циклы. Так-то любая операция со строками выделение памяти. У тебя точно настолько нагруженный код, что ты в нём строки запретил?
Дак вот именно что уйти от выделений и подсовывать везде один и тот же итератор это не одно и тоже
Контейнер это лист или словарь? Для листа я делал патч с прямым доступом к данным
Зачем это в Дельфи - хз. Вообще итератор - это в первую очередь абстракция. Например в .net всё контейнеры реализуют IEnumerable/IEnumerator . Это даёт возможность писать функции, которые могут принять любой контейнер(массив, List, Set) и единообразно с ним работать. Естественно для реализации интерфейса нужен класс. При этом для самых распространенных контейнеров есть доп. энумератор - структура(рекорд). Поэтому если ты просто перечисляет элементы в List никаких выделений памяти не будет. Технически в последних дельфях можно сделать так же. Почему не делают - хз
Это одно и то же. Если ты хочешь иметь несколько итераторов, то у каждого должна быть своя память. Если ты хочешь выделять память один раз, значит это один итератор.
Скорее всего потому, что дельфа не умеет компилировать код в рантайме, может в итоге очень медленно получиться там, где Hotspot VM через пару минут заинлайнит десятки функций в пару команд процессора
я не с той стороны зашел. по сути мне нужен просто доступ на запись. сейчас это можно только через итераторы
И выделение памяти конечно будет, сделай функцию, которая возвращает рекорд (а не указатель) и посмотри как она вызывается. Вызыватель обязан выделить память под рекорд и проинициализировать её. А потом удалить. Это вероятно будет слегка быстрее, потому что TObject.Create - это цепочка из 6 что-ли функций КРОМЕ выделения памяти. С другой стороны, зануление памяти одним FillChar будет быстрее, чем отдельное зануление каждого managed-поля.
наверно в делфи так. в фпц в томже TMap в штатном итераторе виртуальности нет как таковой и ненужна она. рекорб вместо класса бужет куда практичнее
Что значит, что запись только через итераторы, если у тебя хэш-таблица? Dictionary1['abcde'] := 12345; Итератор тут вроде не нужен
ну, а теперь перепиши его. или его часть чтоб AddOrSetValue тоже не очень катил
Если под выделением памяти иметь в виду выделение памяти на стеке, то будет. Дин памяти не будет выделяться
Обсуждают сегодня