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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2010, 17:21   #1
Парсифаль
Форумчанин
 
Аватар для Парсифаль
 
Регистрация: 28.04.2009
Сообщений: 186
По умолчанию Завихрения множественного наследования. (Динамическое множественное наследование)

Первый раз столкнулся с тем, что С++ не имеет прямого функционала для решения проблемы. Приходится придумывать обходной путь. Но он тоже достаточно тернистый.

Суть проблемы: в программе создается невероятно большой массив (счет на гигабайты оперативки) объектов класса под названием CurrentState (Это класс, характеризующий состояние системы в момент времени t). Соответственно, пытаюсь как-то обойти эту проблему.
Пришлось создать 10 классов, унаследованных от CurrentState, потому что во время работы программы пользователь сам решает какие наборы параметров, характеризующих состояние системы ему интересны. Т.е. пользователь дефакто выбирает какие из этих 10 классов ему интересны.
Хотелось бы каким-нибудь образом сгенерировать класс с множественным наследованием от выбранных классов. Динамически.

Есть какие-нибудь мысли?

Я вот пошел по пути создания нового класса, который в зависимости от выбора пользователя создает объекты соответсвующих классов. Но там возникают сложности с приведением типов.
Ruft ihm es zu durch alle Land', Der durch dies Wunder Gnade fand!
Hoch uber aller Welt ist Gott, Und Sein Erbarmen ist kein Spott
Парсифаль вне форума Ответить с цитированием
Старый 08.02.2010, 18:26   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Возможно, стоит отказаться от ООП, и работать с сырой памятью. Допустим, первый байт ячейки представляет собой битовую маску, определяющий, какие данные хранятся в текущем элементе. Для ускорения поиска по массиву можно сделать таблицу соответствия [первый байт] -> [размер ячейки]. А можно размер хранить отдельно - будет быстрее, но менее экономно.

P. S. union-ы иногда позволяют экономить оперативку.

Последний раз редактировалось ds.Dante; 08.02.2010 в 18:29.
ds.Dante вне форума Ответить с цитированием
Старый 08.02.2010, 18:55   #3
Парсифаль
Форумчанин
 
Аватар для Парсифаль
 
Регистрация: 28.04.2009
Сообщений: 186
По умолчанию

Данте, я только въехал в ООП - не готов отказаться)
Вроде я придумал нормальный способ. Сейчас создам тему с конкурсом на подобную задачу.
Ruft ihm es zu durch alle Land', Der durch dies Wunder Gnade fand!
Hoch uber aller Welt ist Gott, Und Sein Erbarmen ist kein Spott
Парсифаль вне форума Ответить с цитированием
Старый 09.02.2010, 12:45   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Суть проблемы: в программе создается невероятно большой массив (счет на гигабайты оперативки) объектов класса под названием CurrentState (Это класс, характеризующий состояние системы в момент времени t).
Невероятно большой массив? А нахрена хранить все объекты в оперативке? Я думаю в оперативке стоит хранить только несколько последних, а остальные - сохранять на диск в каком-то удобном формате.
А совет ds.Dante я вообще считаю самым лучшим решением данной задачи. К тому же вам понадобится только один класс-парсер, который будет разбирать битовую маску и выводить в объект класса состояния системы.
MaTBeu вне форума Ответить с цитированием
Старый 09.02.2010, 13:04   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Парсифаль Посмотреть сообщение
Суть проблемы: в программе создается невероятно большой массив (счет на гигабайты оперативки) объектов класса под названием CurrentState (Это класс, характеризующий состояние системы в момент времени t).
Не уверен, что пользователю столько нужно. Что именно за данные, откуда они берутся в таком количестве и как впоследствии обрабатываются?
Цитата:
Сообщение от Парсифаль Посмотреть сообщение
Хотелось бы каким-нибудь образом сгенерировать класс с множественным наследованием от выбранных классов. Динамически.
С++ не поддерживает динамического наследования. Все классы создаются во время компиляции.
Цитата:
Сообщение от Парсифаль Посмотреть сообщение
Я вот пошел по пути создания нового класса, который в зависимости от выбора пользователя создает объекты соответсвующих классов. Но там возникают сложности с приведением типов.
Я бы создал класс-контейнер характеристик. И в нём массив этих самых характеристик. Поставил пользователь галочку - добавилась характеристика в массив. Убрал - удалилась. Другой вопрос как это потом всё обрабатывать и как узнать какая характеристика есть, а какой нет. Всё это решается, но реализация зависит от задачи.
pu4koff вне форума Ответить с цитированием
Старый 09.02.2010, 13:18   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Чесно говоря я бы для обработки такого кол-ва данных пихнул бы их в БД, и пусть уже MS SQL ну или другая СУБД сама разбирается с ними, думаю скорость работы программы заметно повысилась бы. Да и выборки они умеют делать лучше чем бы ты написал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.02.2010, 13:56   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Чесно говоря я бы для обработки такого кол-ва данных пихнул бы их в БД, и пусть уже MS SQL ну или другая СУБД сама разбирается с ними, думаю скорость работы программы заметно повысилась бы. Да и выборки они умеют делать лучше чем бы ты написал.
Ага, а если каждую секунду нужно добавлять и получать данные? БД с таким врядли справится.
MaTBeu вне форума Ответить с цитированием
Старый 09.02.2010, 14:01   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
MaTBeu
Я бы обязательно попробовал, но к тому же оптимизировал все это как можно сильнее. Например получать данные не по одному а пакетом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.02.2010, 14:08   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Чесно говоря я бы для обработки такого кол-ва данных пихнул бы их в БД, и пусть уже MS SQL ну или другая СУБД сама разбирается с ними, думаю скорость работы программы заметно повысилась бы. Да и выборки они умеют делать лучше чем бы ты написал.
Ну тут зависит от природы данных. Может это данные с каких-нибудь датчиков, которые добавляются каждую секунду и по этим данным строятся графики. Если это более или менее статичные данные, то может и СУБД есть смысл подключать. Тут скорее вопрос не в том: справится ли СУБД, а в том: нужно ли сливать данные в БД, а потом их же оттуда читать.
pu4koff вне форума Ответить с цитированием
Старый 09.02.2010, 14:23   #10
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Я как раз сейчас работаю над программой, которая записывает данные с датчиков (именно каждую секунду, и по ним строятся графики), и объём накопленных данных достигает сотен мегабайт. Только у меня уже есть стандартный формат файла, в котором все поля имеют одинаковый размер.

Самый интересный кусок работы - чтение такого файла. Буду использовать WinAPI-шное проецирование файлов в память, которое позволяет относительно быстро работать с файлами, даже если они больше размера оперативки. Плюс кеширование за счёт холостого чтения данных (буду предугадывать, каких именно).

Кстати, БД используются, но немного другим боком: работа с данными и визуализация разделены на два модуля, работающие по схеме провайдера/потребителя. Я как раз пишу модуль работы с данными.


Парсифаль, лучше придумай какую-нибудь задачу, более требовательную к ООП, например, написать графический интерфейс в OpenGL (типа как в современных игрушках). Что касается той задачи, возможно, проецирование файлов станет простейшим решением. Про это можно почитать у Рихтера.

Последний раз редактировалось ds.Dante; 09.02.2010 в 15:15.
ds.Dante вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль.Использование множественного типа **star** Помощь студентам 9 21.11.2009 16:44
Проблема в программе на С++, множественное исполнение цикла Vikelf Помощь студентам 1 25.05.2009 09:31
Множественное наследование Crucian Общие вопросы Delphi 1 29.12.2008 14:26
Множественное перемещение в двух таблицах Arteom БД в Delphi 7 16.07.2008 16:59