Я создаю движок, который управляет событиями и выполняет различные действия в зависимости от конкретных правил ввода.
Допустим, у меня есть Элемент A, который при поступлении события выдает значение x. Когда он создается, он отправляет событие в систему, которое уведомляет другие элементы. Получив уведомление, эти элементы получают из сообщения события идентификатор отправителя и получают значение непосредственно от отправителя, а не от объекта события.
Что вы думаете об этом с точки зрения производительности?
Другой альтернативой является сохранение вычисленного значения производителя элемента в событии, но, поскольку я хотел бы избегать вызова нового оператора слишком много раз, я не думаю, что это жизнеспособное решение.
Даже используя что-то вроде:
struct Event
{
int idProducer;
MyEnumType type;
union Storage
{
uint32_t intElement;
double doubleElement;
void* voidElement;
MyValueBase* baseElement;
};
};
Если большинство производителей используют новый оператор, он не будет работать для меня.
Недостатком первого подхода, вероятно, является необходимость использования дополнительных мьютексов.
Какое решение вы бы выбрали?
[править] По запросу я предоставлю более подробную информацию:
будет больше тем
Структура, которую я имел в виду при использовании решения с вычисленным значением в элементе Executer:
// This is not the actual code but just a semplification:
struct ExecuterBase
{
virtual void manageEvent(const Event& event)=0;
virtual void addEvent(const Event& event)
{
eventQueue.push(event);
}
SharedState* state_;
int idElement_;
};
template<class ReturnType>
struct ExecuterBaseR : ExecuterBase
{
virtual ReturnType result() = 0;
};
struct ConcreteExecuter : ExecuterBaseR<double>
{
void manageEvent(const Event& e) override
{
result_ = /* something computed*/;
}
double result() {return result_;}
};