Это безопасно от оптимизации компилятора? - PullRequest
0 голосов
/ 10 июня 2018

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

Идея, лежащая в основе примера, состоит в том, что пользовательская функция «Процесс» в производном от пользователя классе может вызывать«ProcessMessage» в базе платформы, вызывая рекурсивный вызов.Если произошел рекурсивный вызов, то сообщение помещается в очередь для дальнейшей обработки.

Вопрос в том, защищены ли два флага «обработки» вокруг вызова производной функции от оптимизации компилятора?

//*************************************
// Framework code.
//*************************************
template <typename TDerived>
class Base
{
public:

  Base()
    : processing(false)
  {
  }

  void ProcessMessage(int msg)
  {
    if (processing)
    {
      // Queue the message for later.
    }
    else
    {
      processing = true; // Are these safe from optimisation?

      // Calls user derived class function
      static_cast<TDerived&>(*this).Process(msg);

      processing = false; // Are these safe from optimisation?
    }
  }

private:

  bool processing;
};

//*************************************
// User code.
//*************************************
class Derived : public Base<Derived>
{
public:

  void Process(int msg)
  {
    if ((msg % 4) == 0)
    {
      this->ProcessMessage(msg); // Recursive call.
    }
  }
};

int main()
{
  Derived derived;

  derived.ProcessMessage(0);
  derived.ProcessMessage(1);

  return 0;
}

1 Ответ

0 голосов
/ 10 июня 2018

Стандарт, который вы найдете:

intro.execution.16

Каждое вычисление значения и побочный эффект, связанный с полным выражением, последовательно перед каждымвычисление значения и побочный эффект, связанный со следующим полным выражением, которое будет оценено.

Таким образом, ваша программа «защищена от оптимизации».Но, как указано в комментариях, у вас все еще могут быть проблемы с исключениями или параллелизмом.

...