Будучи несколько параноиком в отношении того, чтобы быть пойманным оптимизациями компилятора, я хотел бы узнать мнение о правильности следующего кода.Базовый класс является частью общей структуры, но производная будет создана пользователем указанной структуры.
Идея, лежащая в основе примера, состоит в том, что пользовательская функция «Процесс» в производном от пользователя классе может вызывать«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;
}