我正在创建一个管理事件的引擎,并根据特定的输入规则执行不同的操作。
假设我有元素A,当事件到达时,元素A会产生一个值x。产生时,它将事件发送给系统,通知其他元素。收到通知后,这些元素将从事件消息中获取发送者的ID,并直接从发送者而不是从事件对象获取值。
您对性能有何看法?
另一种选择是将Element生产者的计算值存储到Event中,但是由于我想避免多次调用new运算符,因此我认为这不是可行的解决方案。
即使使用类似的东西
struct Event
{
int idProducer;
MyEnumType type;
union Storage
{
uint32_t intElement;
double doubleElement;
void* voidElement;
MyValueBase* baseElement;
};
};
如果大多数生产者都使用new运算符,那么它将对我不起作用。
第一种方法的缺点可能是可能需要使用额外的互斥锁。
您会选择哪种解决方案?
[edit]我将根据要求提供更多详细信息:
会有更多线程
如果将解决方案与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_;}
};