Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Класс редактирования данных. Нужны советы по реализации
|
|||
|---|---|---|---|
|
#18+
Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор. Редактирование, на первый взгляд, тривиальное и реализуется тремя методами класса: Код: plaintext 1. 2. 3. Казалось бы, все просто: выделяй память, заменяй, удаляй, добавляй... Однако в процессе редактирования данных промежуточные итоги мне не нужны - требуется только конечный результат. Поэтому возникла мысль не изменять данные при каждом вызове методов, а только лишь сохранять информацию об изменениях. А когда будет запрошен результат, тогда уж и формировать его. Представим, есть объект класса с переданным ему для редактирования блоком данных. Допустим, у нас произошел последовательный вызов таких методов: Код: plaintext 1. 2. 3. На деле, такая запись аналогична записи: Код: plaintext 1. Поэтому реальное изменение данных "на лету" не оптимально, если учесть, что промежуточный результат (как я уже писал) мне не интересен. "Компоновкой" получившегося должен заниматься отдельный метод, возвращающий результат всей работы объекта: Код: plaintext 1. Осталось только придумать, как хранить и обрабатывать информацию о поступивших изменениях. Вот с этим-то у меня и затык. Ничего, что очевидно выигрывает у memcpy() и memmove() по скорости и ресурсам, в голову не приходит. Поделитесь своими мыслями. Ах, да! Чуть не забыл главное условие: никаких стандартных и, уж тем более, сторонних библиотек. Только "чистый" C++ и WinAPI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2014, 22:26 |
|
||
|
Класс редактирования данных. Нужны советы по реализации
|
|||
|---|---|---|---|
|
#18+
lepixaПоэтому возникла мысль не изменять данные при каждом вызове методов, а только лишь сохранять информацию об изменениях. А когда будет запрошен результат, тогда уж и формировать его. Мысль забавная, но бесперспективная. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2014, 22:37 |
|
||
|
Класс редактирования данных. Нужны советы по реализации
|
|||
|---|---|---|---|
|
#18+
Ну почему же бесперспективная? Если каждое изменение по отдельности требует некоторого старт-стопа у которых большой оверхед, и можно все операции сгруппировать в один общий пакет (как пример рисование в OpenGL), то озвученный подход очень даже правильный и перспективный. А если нужно иметь историю изменений с возможностью просмотра полного лога изменений, то это будет единственным возможным решением. Хотя для примитивной арифметики это действительно будет из пушки по воробьям. А по существу вопроса: Сделай себе класс "изменение". В главном классе сделай вектор с элементами этого типа. А по GetData() будешь пробегать по вектору и накладывать все изменения по очереди. И в конце записывать полученный результат в стартовое значение и чистить вектор. Все просто и легко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 02:01 |
|
||
|
Класс редактирования данных. Нужны советы по реализации
|
|||
|---|---|---|---|
|
#18+
lepixa Казалось бы, все просто: выделяй память, заменяй, удаляй, добавляй... Однако в процессе редактирования данных промежуточные итоги мне не нужны - требуется только конечный результат. Поэтому возникла мысль не изменять данные при каждом вызове методов, а только лишь сохранять информацию об изменениях. А когда будет запрошен результат, тогда уж и формировать его. Не сомневаюсь, что такие технологии уже используются. Вам нужно написать метод, на входе будет очередь операций FIFO, например , на выходе оптимизированный стек операций. Да, тогда все ваши методы и т.п. будут не реентерабельны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 02:34 |
|
||
|
Класс редактирования данных. Нужны советы по реализации
|
|||
|---|---|---|---|
|
#18+
Хранить несложно, пиши в массив лог изменений. При хранении придется также хранить MyData для инсертов. Сложно вот это: lepixa... Представим, есть объект класса с переданным ему для редактирования блоком данных. Допустим, у нас произошел последовательный вызов таких методов: Код: plaintext 1. 2. 3. На деле, такая запись аналогична записи: Код: plaintext 1. Начни с того что попробуй реализовать это упрощение. ИМХУ получится долгоиграющая считалка, которая сожрет все сэкономленное время. Такие задачи решаются по другому: почитай как это устроено в MSSQL-сервере (в книгах по нему это подробно расписано). Если упрощенно: там идет постраничное хранение, физически страницы в памяти не по порядку, есть отдельный индекс страниц (хранящий их логический порядок), страницы заполнены неполностью, в случае вставки просто дописываются в нужную страницу, если ее нехватает - создается пустая страница и исправляется индекс. Изменения вносятся сразу, но для вставки не требуется сдвигать весь хвост, сдвиг только в пределах страницы. lepixaОднако в процессе редактирования данных промежуточные итоги мне не нужны - требуется только конечный результат. Тогда это можно распараллелить: первый поток просто ставит задания на изменения в очередь, а второй читает и вносит эти изменения в данные. Но тут остается проблема с хранением MyData для инсертов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 07:19 |
|
||
|
Класс редактирования данных. Нужны советы по реализации
|
|||
|---|---|---|---|
|
#18+
lepixaКазалось бы, все просто: выделяй память, заменяй, удаляй, добавляй... Однако в процессе редактирования данных промежуточные итоги мне не нужны - требуется только конечный результат. Поэтому возникла мысль не изменять данные при каждом вызове методов, а только лишь сохранять информацию об изменениях. А когда будет запрошен результат, тогда уж и формировать его. Мысль весьма сомнительна. Она будет "играть" только если подготовителные операции для одного изменения велики по сравнению с этим изменением, и изменений много (и к каждому изменению подготовка одинакова). В условиях, когда кол-во и качество изменений диктуется извне (клиентом класса), ещё более сомнительна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 10:48 |
|
||
|
Класс редактирования данных. Нужны советы по реализации
|
|||
|---|---|---|---|
|
#18+
lepixaОсталось только придумать, как хранить и обрабатывать информацию о поступивших изменениях. Вот с этим-то у меня и затык. Ничего, что очевидно выигрывает у memcpy() и memmove() по скорости и ресурсам, в голову не приходит. Поделитесь своими мыслями. А там ничего более и не нужно. А для реализации отложенных модификаций -- паттерн Command и потом его проигрывание. Я рекомендую всё же сделать сначала простейшую реализацию, а затем уже усложнять оптимизациями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 10:50 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38747545&tid=2019301]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 160ms |

| 0 / 0 |
