Код: Выделить всё
const bool b1 = fn1(); // Long-running function without side effects
const bool b2 = fn2(); // Long-running function without side effects
const bool cond = b1 || b2;
// Code that uses cond
Вопрос в том, что насчет const bool b2 = fn2()? Здесь я вижу три возможных ответа:
- b2 будет вычисляться и вызываться fn2 независимо от значения b1, так как это разные последовательные операторы (скорее всего для я).
- это полностью зависит от оптимизатора и не предусмотрено стандартом; оптимизатор может пропустить вычисление b2 и вызов fn2, если он может гарантировать отсутствие побочных эффектов и т. д. (может быть и так).
- b2 не будет рассчитываться и fn2 не будет вызывается, если b1 истинно, поскольку этот код проверки ленивой оценки встроен в представление кода абстрактного синтаксического дерева при его компиляции и будет автоматически опущен любым разумным компилятором. (Я вообще не верю, что такое может быть. В любом случае, оставим это здесь).
Если 3 не является правильным (что, я уверен, неверно), мне нужен надежный способ извлечь выгоду из ленивых вычислений.
Конечно, в этом простом сценарии это будет:
Код: Выделить всё
const bool cond = fn1() || fn2();
// Code that uses cond
Код: Выделить всё
const bool keep_all_values =
update_strategy_branches ||
0 == std::count_if(database.begin(), database.end(),
[=](const MyTypeToGetAccessToMembersInIDE& value) { return value.member->field == some_value; });
Код: Выделить всё
database
Обновление по запросу из комментариев ниже
Пожалуйста, не путайте этот вопрос с вопросом: обязательно ли сокращение логических операторов? И порядок оценки? и много подобных вопросов, которые намного проще и могут возникнуть перед этим. Я знаю, как работает ленивое вычисление для этих операторов, и знаю, когда и зачем его использовать. Мой вопрос следующий после этих вопросов: влияет ли это на расчет предыдущих утверждений и как еще извлечь выгоду из ленивой оценки, если нет?
Подробнее здесь: https://stackoverflow.com/questions/793 ... de-concise