Например, если у меня есть этот код:
class SomeDataProcessor
{
public:
bool calc(const SomeData & d1, const SomeData & d2) const;
private:
//Some non-mutable, non-static member variables
}
SomeDataProcessor sdp;
SomeData data1;
SomeData data2;
someObscureFunction(sdp.calc(data1, data2),
sdp.calc(data1, data2));
Рассмотрим эквивалентный код потенциально:
bool b = sdp.calc(data1, data2);
someObscureFunction(b,b);
Чтобы это было правильно, функция calc()
должна удовлетворять некоторым требованиям, и для примера я вызываю свойство _pure_const_formula_
A _pure_const_formula_
:
- Не изменять член, статическое или глобальное переменное состояние
- Вызов только
_pure_const_formula_
функции - Возможно, некоторые другие условия, о которых я не помню
Например, вызов генератора случайных чисел не соответствовал бы этим требованиям.
Разрешено ли компилятору заменять первый код вторым, даже если ему нужно копать рекурсивно в вызываемые функции? Могут ли современные компиляторы сделать это?