Не может быть лучше объяснено.

дующем коде, что происходит во время выполнения?

while ( ([]()->bool { return something(); })() ) {
    ...
}
Лямбда-экземпляр создается только один раз и повторно используется в последующих итерациях.Каждая итерация создает новый экземпляр, который используется только один раз.Ничего из вышеперечисленного (пожалуйста, объясните).

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

 Ed Heal29 нояб. 2017 г., 07:08
Разве лямбда не является синтаксическим сахаром для функции (просто анонимной)?
 karliwson29 нояб. 2017 г., 07:13
@EdHeal, по сути, да, но AFAIK, он реализован как вызываемый объект, который имеет жизненный цикл, как и любой другой объект.
 n.m.29 нояб. 2017 г., 07:14
Компилятор, скорее всего, полностью оптимизирует лямбду. Почему это имеет значение?

Ответы на вопрос(1)

Решение Вопроса

[Stmt.while] / 1

В операторе while подстановка выполняется многократно, пока значение условия ([stmt.select]) не станет ложным.Тест проводится перед каждым выполнением подстанции.

[Expr.prim.lambda] / 2

Лямбда-выражение - это значение, результат которого называется объектом замыкания.

Выше говорит, что использовать([]()->bool { return something(); })() оценивается перед каждой итерацией. И это подвыражение[]()->bool { return something(); } создает prvalue. Так что это оживает только во время оценки полного выражения.

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

Но компиляторы не глупы. Я считаю, что по правилу «как будто» это более чем вероятно, будет оптимизировано в прямой вызовsomething(), Это потому, что строительство и уничтожение лямбда не имеет видимых побочных эффектов.

И если мы действительно используем такой инструмент, какГодболт онлайн просмотра компиляторамы видим, что GCC 7.2 в-O1 вызову функцию напрямую. И Clang 5.0 тоже, но мне пришлось провернуть оптимизацию, чтобы-O2 чтобы это произошло.

 karliwson29 нояб. 2017 г., 18:43
Не может быть лучше объяснено.

Ваш ответ на вопрос