Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2014, 22:30   #1
shade2009
 
Регистрация: 17.08.2014
Сообщений: 5
По умолчанию Класс редактирования данных. Нужны советы по реализации

Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор. Редактирование, на первый взгляд, тривиальное и реализуется тремя методами класса:
Код:
void Change(unsigned long StartByte, const void *NewData, unsigned long DataSize);
void Delete(unsigned long StartByte, unsigned long Size);
void Insert(unsigned long StartByte, const void *Data, unsigned long DataSize);
Казалось бы, все просто: выделяй память, заменяй, удаляй, добавляй... Однако в процессе редактирования данных промежуточные итоги мне не нужны - требуется только конечный результат. Поэтому возникла мысль не изменять данные при каждом вызове методов, а только лишь сохранять информацию об изменениях. А когда будет запрошен результат, тогда уж и формировать его.

Представим, есть объект класса с переданным ему для редактирования блоком данных. Допустим, у нас произошел последовательный вызов таких методов:
Код:
Insert(5, MyData, 10); // Вставляем между 4-ым и 5-ым байтами 10 байтов MyData.
Delete(7, 2); * * * * *// Удаляем 7-ой и 8-ой байты.
Delete(4, 10); * * * * // Удаляем с 4-го по 13-ый байты.
На деле, такая запись аналогична записи:
Код:
Delete(4, 2);
Поэтому реальное изменение данных "на лету" не оптимально, если учесть, что промежуточный результат (как я уже писал) мне не интересен. "Компоновкой" получившегося должен заниматься отдельный метод, возвращающий результат всей работы объекта:
Код:
unsigned long GetData(void *Buffer, unsigned long BufferSize);
Осталось только придумать, как хранить и обрабатывать информацию о поступивших изменениях. Вот с этим-то у меня и затык. Ничего, что очевидно выигрывает у memcpy() и memmove() по скорости и ресурсам, в голову не приходит. Поделитесь своими мыслями.

Ах, да! Чуть не забыл главное условие: никаких стандартных и, уж тем более, сторонних библиотек. Только "чистый" C++ и WinAPI.
shade2009 вне форума Ответить с цитированием
Старый 16.09.2014, 00:32   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от shade2009 Посмотреть сообщение
Поэтому возникла мысль не изменять данные при каждом вызове методов, а только лишь сохранять информацию об изменениях.
То есть вы решили не хранить итоговые данные а вместо этого хранить все изменения?

http://en.wikipedia.org/wiki/Gap_buffer
http://www.drdobbs.com/architecture-...ture/184408975
waleri вне форума Ответить с цитированием
Старый 16.09.2014, 04:29   #3
Notegimcool
 
Регистрация: 03.02.2014
Сообщений: 7
По умолчанию

Вам будет очень сложно обогнать функции стандартной библиотеки выполняющие те же задачи. Да и зачем.
Notegimcool вне форума Ответить с цитированием
Старый 16.09.2014, 07:25   #4
shade2009
 
Регистрация: 17.08.2014
Сообщений: 5
По умолчанию

Если обогнать можно, то ответ на вопрос "зачем?" очевиден. Если нельзя, тогда незачем.
shade2009 вне форума Ответить с цитированием
Старый 16.09.2014, 07:44   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Почитайте про устройство класса StringBuilder в C#.
pu4koff вне форума Ответить с цитированием
Старый 16.09.2014, 08:01   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Если обогнать можно, то ответ на вопрос "зачем?" очевиден.
Не очень. Ты хочешь сделать журналирование как в СУБД. Но там оно создано не для скорости, более того оно может проигрывать скорость задачи. Такие вещи делают прежде всего для отказоустойчивости программы. Или для откатов типа Undo.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2014, 14:39   #7
Fomikc
 
Регистрация: 13.08.2014
Сообщений: 4
По умолчанию

Цитата:
Сообщение от shade2009
Однако в процессе редактирования данных промежуточные итоги мне не нужны - требуется только конечный результат.
А на следующий день внезапно (!) понадобятся. Экономия на спичках. Усложнение архитектуры. Читающий такое не раз скажет: "wtf?"
Fomikc вне форума Ответить с цитированием
Старый 16.09.2014, 17:59   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от shade2009 Посмотреть сообщение
Осталось только придумать, как хранить и обрабатывать информацию о поступивших изменениях. Вот с этим-то у меня и затык. Ничего, что очевидно выигрывает у memcpy() и memmove() по скорости и ресурсам, в голову не приходит. Поделитесь своими мыслями.

Ах, да! Чуть не забыл главное условие: никаких стандартных и, уж тем более, сторонних библиотек. Только "чистый" C++ и WinAPI.
Общая схема:

У вас есть данные, которые нужно обработать.
И контейнер,куда набиваются обработчики данных.

Когда вы хотите выполнить над данными операцию - на самом деле вы добавляется в контейнер ещё один обработчик:

Код:

Image img;

//<--- в контейнер добавляется метод Image::SetSize() с заранее забитыми аргументами
img.SetSize(param); 

//<--- в контейнер добавляется метод Image::SetAplha() с заранее забитыми аргументами
img.SetAplha(param); 

//<--- последовательно достает из контейнера методы и выполняет их
//если для них были заранее забитые аргументы - прямо с этими же аргументами.
img.Run();
А дальше уже насколько хватит фантазии:

Например, при добавлении в контейнер очередного метода, можно посмотреть - если новый метод аннулирует действия предыдущего - предыдущий можно удалить из контейнера сразу.

Ну и тд и тп.


По поводу выигрыша по скорости у memcpy(), это вы конечно, погорячились.

Такой подход действительно полезен, и имеет массу полезных свойств.
Но это явно не средство оптимизации. И в большинстве случаев работа только замедлится.

Главное преимущество подхода - в ряде случаев удобным и простым для программиста образом позволяет реализоваться сложные процессы.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужны советы программистов Clarus Софт 4 11.08.2012 10:45
Нужны советы Nikolai2010 Работа с сетью в Delphi 0 05.05.2012 14:02
Нужны советы... Makc19977 JavaScript, Ajax 18 25.02.2012 18:57
Поясните задачу... Дайте советы по её реализации SWAT92Shtorm Помощь студентам 10 19.06.2009 19:27
Нужны советы по Java shkipper Помощь студентам 1 08.04.2009 02:28