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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.78
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5436 / 2560 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
03.07.2013, 10:25     Ленивые вычисления #1
____Много есть информации под 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, тело первого оператора условия не будет выполнено.
Оба приведенных кода делают одно и то же. Отличие лишь в компромиссе между читабельностью кода и его объемом.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.07.2013, 21:29     Ленивые вычисления #21
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Общий смысл "ленивых вычислений" в том, что экономится время на проведении вычислений, результаты которых заведомо не будут использованы в дальнейшем программой.
Ну это лишь побочный эффект.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
В плюсах только со стандарта C++0x
&& не вычисляет правый операнд еще с сишных времен.

Вообще, хороший пример ленивых вычислений - LINQ/yield в шарпе. В плюсах я ничего подобного не замечал.
Можно, конечно, проэмулировать, но в язык это не встроено. Да и не нужно оно особо в плюсах-то...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
03.07.2013, 21:44     Ленивые вычисления #22
Цитата Сообщение от diagon Посмотреть сообщение
&& не вычисляет правый операнд еще с сишных времен.
неетт, идея целиком и полностью скопирована с асма, если даже не с какого-то пдп-11
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 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
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
03.07.2013, 23:47     Ленивые вычисления #24
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Там же if (a && b && c) принципиально вычисляется как
именно, отсюда и следует "ленивость" && и ||
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
04.07.2013, 02:21     Ленивые вычисления #25
Хороший пример - Copy on write.
Вот еще: Создать класс для сортировки массива по убыванию любым способом
Там пока не требуется вывод на экран, данные не сортируются. Чаще делают подсчет результата функции лишь при обращении, при этом ставят флаг для того, чтобы не пересчитывать.
Пример с операторами в условии - бред, оно же итак представиться в компиляторе как во втором варианте, а вот писать таким способом(множество if-ов) - гробить читаемость программы.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5436 / 2560 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
04.07.2013, 08:48  [ТС]     Ленивые вычисления #26
Цитата Сообщение от diagon Посмотреть сообщение
Ну это лишь побочный эффект.
А придумывалось тогда зачем?
Цитата Сообщение от diagon Посмотреть сообщение
&& не вычисляет правый операнд еще с сишных времен.
Да, как и большинство процедурных языков. Но с сишных времен не было функторов.
Цитата Сообщение от MrGluck Посмотреть сообщение
Пример с операторами в условии - бред, оно же итак представиться в компиляторе как во втором варианте
Компилятор не имеет представления о наглядности.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
05.07.2013, 00:18     Ленивые вычисления #27
SatanaXIII, я имею в виду логику вычислений. То есть до проверки B оно не дойдет, если не выполнилось условие A.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 10:18     Ленивые вычисления
Еще ссылки по теме:

C++ Параллельные вычисления
Вычисления C++
C++ Написать процедуру для вычисления коэффициентов и функцию для вычисления значения многочлена

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

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5436 / 2560 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
05.07.2013, 10:18  [ТС]     Ленивые вычисления #28
Цитата Сообщение от MrGluck Посмотреть сообщение
То есть до проверки B оно не дойдет, если не выполнилось условие A.
Именно это пример и иллюстрирует. В записи с && это не наглядно. Это логично, понятно, будет работать и прочее, но это не наглядно. Вот вся суть примера.
Yandex
Объявления
05.07.2013, 10:18     Ленивые вычисления
Ответ Создать тему

Метки
ленивые операторы вычисления
Опции темы

Текущее время: 02:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru