Реализация событий в C ++ с учетом производительности - PullRequest
0 голосов
/ 26 января 2019

Я создаю движок, который управляет событиями и выполняет различные действия в зависимости от конкретных правил ввода.

Допустим, у меня есть Элемент 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_;}
};
...