Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.78
SatanaXIII
Супер-модератор
Эксперт С++
5592 / 2626 / 239
Регистрация: 01.11.2011
Сообщений: 6,457
Завершенные тесты: 1
#1

Ленивые вычисления - C++

03.07.2013, 10:25. Просмотров 2469. Ответов 27

____Много есть информации под boost, так же не отстает шарп и опережает всех хаскель. В плюсах только со стандарта C++0x. Даже попалась цельная Qt-шная библиотека для этого дела. Вообще концепция ленивых вычислений зародилась для функциональных языков. Но это все придумано, если возвращаться к C++, для удобства оперирования функторами и еще каких-то таинств. Но по сути же простые "ленивые вычисления" доступны во многих языках, компиляторы которых действуют по некоему принципу call by value. То есть когда значение получено, дальше его обсчитывать смысла нет. Если первый операнд операции && ложен, то вычислять следующие не нужно.
____Общий смысл "ленивых вычислений" в том, что экономится время на проведении вычислений, результаты которых заведомо не будут использованы в дальнейшем программой. Соответственно, за счет снижения объемов вычислений повышается и производительность программы, а за счет отсутствия необходимости хранить в памяти результаты вычислений снижаются и требования программы к памяти. Помимо этого, ленивые вычисления избавляют программиста от необходимости следить за тем, какие именно вычисления будут в дальнейшем востребованы программой, а какие, напротив, окажутся совершенно бесполезными. Последнее не всегда хорошо, учитывая опять же гибкость плюсов, в которых компилятор не даст, вопреки обычному подходу, поступать как заблагорассудится программисту. Но на то в принципе и расчет.

Принцип "ленивого вычисления" проще всего рассмотреть на следующем примере:
C++
1
if (A && B && C && D) {...}
C++
1
2
3
4
5
6
7
8
9
if (A) {
  if (B) {
    if (C) {
      if (D) {
        ...
      }
    }
  }
}
В первом случае не понятно, что, если A ложно, то и остальные вычисления происходить не будут. Во-втором же наглядно видно, что, при ложном A, тело первого оператора условия не будет выполнено.
Оба приведенных кода делают одно и то же. Отличие лишь в компромиссе между читабельностью кода и его объемом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 10:25     Ленивые вычисления
Посмотрите здесь:

Ленивые вычисления - Java
Добрый вечер, Уважаемые форумчане! Есть вот такое задание: С помощью класса Stream опишите функцию, генерирующую имя для нового...

Напишите программу вычисления суммы: 1! + 2! + 3! + … + n!, используя функцию вычисления факториала числа k - Pascal ABC
Напишите программу вычисления суммы: 1! + 2! + 3! + … + n!, используя функцию вычисления факториала числа k.

Напишите программу вычисления суммы: 1! + 2! + 3! + … + n!, используя функцию вычисления факториала числа k. - C++
Напишите программу вычисления суммы: 1! + 2! + 3! + … + n!, используя функцию вычисления факториала числа k. И вновь заранее благодарю,...

Составить блок-схему, алгоритм вычисления и программу для вычисления значения кусочно заданной функции - C++
помогите пожалуйста =) заранее благодарен =) П.5.19.Правил Запрещено создавать темы в виде ссылок на задания или коды программ,...

Выбрать алгоритм и составить его блок-схему для вычисления значения указанной функции.Составить программу вычисления - Free Pascal
Пожалуйста,помогите!!!

Написать процедуру для вычисления коэффициентов и функцию для вычисления значения многочлена - C++
Задано многочлен {P}_{n}(x) степени n<=100, коэффициенты которого содержатся в действительном массиве A(n+1), и действительные числа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
1926 / 1192 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.07.2013, 21:29     Ленивые вычисления #21
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Общий смысл "ленивых вычислений" в том, что экономится время на проведении вычислений, результаты которых заведомо не будут использованы в дальнейшем программой.
Ну это лишь побочный эффект.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
В плюсах только со стандарта C++0x
&& не вычисляет правый операнд еще с сишных времен.

Вообще, хороший пример ленивых вычислений - LINQ/yield в шарпе. В плюсах я ничего подобного не замечал.
Можно, конечно, проэмулировать, но в язык это не встроено. Да и не нужно оно особо в плюсах-то...
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
03.07.2013, 21:44     Ленивые вычисления #22
Цитата Сообщение от diagon Посмотреть сообщение
&& не вычисляет правый операнд еще с сишных времен.
неетт, идея целиком и полностью скопирована с асма, если даже не с какого-то пдп-11
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.07.2013, 22:38     Ленивые вычисления #23
В асме уже появились составные операторы? Там же if (a && b && c) принципиально вычисляется как
C++
1
2
3
4
5
6
if (a)
    if (b)
        if (c)
        {
            // ...
        }
Не, ну можно, конечно, как
C++
1
2
3
4
5
6
7
bool cond = true;
cond &= (bool) a;
cond &= (bool) b;
cond &= (bool) c;
if (cond) {
    // ...
}
Но так же пролюбливается драгоценный регистр.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
03.07.2013, 23:47     Ленивые вычисления #24
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Там же if (a && b && c) принципиально вычисляется как
именно, отсюда и следует "ленивость" && и ||
MrGluck
Модератор
Эксперт CЭксперт С++
6969 / 4140 / 588
Регистрация: 29.11.2010
Сообщений: 10,978
04.07.2013, 02:21     Ленивые вычисления #25
Хороший пример - Copy on write.
Вот еще: Создать класс для сортировки массива по убыванию любым способом
Там пока не требуется вывод на экран, данные не сортируются. Чаще делают подсчет результата функции лишь при обращении, при этом ставят флаг для того, чтобы не пересчитывать.
Пример с операторами в условии - бред, оно же итак представиться в компиляторе как во втором варианте, а вот писать таким способом(множество if-ов) - гробить читаемость программы.
SatanaXIII
Супер-модератор
Эксперт С++
5592 / 2626 / 239
Регистрация: 01.11.2011
Сообщений: 6,457
Завершенные тесты: 1
04.07.2013, 08:48  [ТС]     Ленивые вычисления #26
Цитата Сообщение от diagon Посмотреть сообщение
Ну это лишь побочный эффект.
А придумывалось тогда зачем?
Цитата Сообщение от diagon Посмотреть сообщение
&& не вычисляет правый операнд еще с сишных времен.
Да, как и большинство процедурных языков. Но с сишных времен не было функторов.
Цитата Сообщение от MrGluck Посмотреть сообщение
Пример с операторами в условии - бред, оно же итак представиться в компиляторе как во втором варианте
Компилятор не имеет представления о наглядности.
MrGluck
Модератор
Эксперт CЭксперт С++
6969 / 4140 / 588
Регистрация: 29.11.2010
Сообщений: 10,978
05.07.2013, 00:18     Ленивые вычисления #27
SatanaXIII, я имею в виду логику вычислений. То есть до проверки B оно не дойдет, если не выполнилось условие A.
SatanaXIII
Супер-модератор
Эксперт С++
5592 / 2626 / 239
Регистрация: 01.11.2011
Сообщений: 6,457
Завершенные тесты: 1
05.07.2013, 10:18  [ТС]     Ленивые вычисления #28
Цитата Сообщение от MrGluck Посмотреть сообщение
То есть до проверки B оно не дойдет, если не выполнилось условие A.
Именно это пример и иллюстрирует. В записи с && это не наглядно. Это логично, понятно, будет работать и прочее, но это не наглядно. Вот вся суть примера.
Yandex
Объявления
05.07.2013, 10:18     Ленивые вычисления
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru