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

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

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

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

03.07.2013, 10:25. Просмотров 2740. Ответов 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, тело первого оператора условия не будет выполнено.
Оба приведенных кода делают одно и то же. Отличие лишь в компромиссе между читабельностью кода и его объемом.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 10:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ленивые вычисления (C++):

Ленивые вычисления в C++ - C++
Как переопределить операторы так, чтобы можно было запомнить формулу, чтобы вычислить её по требованию? Ломаю голову уже очень долго. ...

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

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

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

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

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

27
Croessmah
Эксперт CЭксперт С++
13508 / 7666 / 866
Регистрация: 27.09.2012
Сообщений: 18,850
Записей в блоге: 3
Завершенные тесты: 1
03.07.2013, 13:05 #16
Tulosba, из-за перегрузки преобразования bool иногда могут возникнуть неприятные касты
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.07.2013, 13:59 #17
Croessmah, а что если http://en.wikibooks.org/wiki/More_C++_Idioms/Safe_bool ?
1
Croessmah
Эксперт CЭксперт С++
13508 / 7666 / 866
Регистрация: 27.09.2012
Сообщений: 18,850
Записей в блоге: 3
Завершенные тесты: 1
03.07.2013, 18:03 #18
Цитата Сообщение от Tulosba Посмотреть сообщение
а зачем? Лишнийе геморрой проблемы себе на голову
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.07.2013, 18:27 #19
Цитата Сообщение от Croessmah Посмотреть сообщение
а зачем?
я про C++11 версию в частности (explicit bool)
0
Croessmah
Эксперт CЭксперт С++
13508 / 7666 / 866
Регистрация: 27.09.2012
Сообщений: 18,850
Записей в блоге: 3
Завершенные тесты: 1
03.07.2013, 18:31 #20
Цитата Сообщение от Tulosba Посмотреть сообщение
я про C++11 версию в частности (explicit bool)
Не заметил Чтобы не говорили, но в 11 стандарте появилось много плюшек. Ждем рефлексию
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.07.2013, 21:29 #21
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Общий смысл "ленивых вычислений" в том, что экономится время на проведении вычислений, результаты которых заведомо не будут использованы в дальнейшем программой.
Ну это лишь побочный эффект.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
В плюсах только со стандарта C++0x
&& не вычисляет правый операнд еще с сишных времен.

Вообще, хороший пример ленивых вычислений - LINQ/yield в шарпе. В плюсах я ничего подобного не замечал.
Можно, конечно, проэмулировать, но в язык это не встроено. Да и не нужно оно особо в плюсах-то...
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
03.07.2013, 21:44 #22
Цитата Сообщение от diagon Посмотреть сообщение
&& не вычисляет правый операнд еще с сишных времен.
неетт, идея целиком и полностью скопирована с асма, если даже не с какого-то пдп-11
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 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) {
    // ...
}
Но так же пролюбливается драгоценный регистр.
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
03.07.2013, 23:47 #24
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Там же if (a && b && c) принципиально вычисляется как
именно, отсюда и следует "ленивость" && и ||
0
MrGluck
Модератор
Эксперт CЭксперт С++
7417 / 4532 / 671
Регистрация: 29.11.2010
Сообщений: 12,281
04.07.2013, 02:21 #25
Хороший пример - Copy on write.
Вот еще: Создать класс для сортировки массива по убыванию любым способом
Там пока не требуется вывод на экран, данные не сортируются. Чаще делают подсчет результата функции лишь при обращении, при этом ставят флаг для того, чтобы не пересчитывать.
Пример с операторами в условии - бред, оно же итак представиться в компиляторе как во втором варианте, а вот писать таким способом(множество if-ов) - гробить читаемость программы.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,532
Завершенные тесты: 1
04.07.2013, 08:48  [ТС] #26
Цитата Сообщение от diagon Посмотреть сообщение
Ну это лишь побочный эффект.
А придумывалось тогда зачем?
Цитата Сообщение от diagon Посмотреть сообщение
&& не вычисляет правый операнд еще с сишных времен.
Да, как и большинство процедурных языков. Но с сишных времен не было функторов.
Цитата Сообщение от MrGluck Посмотреть сообщение
Пример с операторами в условии - бред, оно же итак представиться в компиляторе как во втором варианте
Компилятор не имеет представления о наглядности.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7417 / 4532 / 671
Регистрация: 29.11.2010
Сообщений: 12,281
05.07.2013, 00:18 #27
SatanaXIII, я имею в виду логику вычислений. То есть до проверки B оно не дойдет, если не выполнилось условие A.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,532
Завершенные тесты: 1
05.07.2013, 10:18  [ТС] #28
Цитата Сообщение от MrGluck Посмотреть сообщение
То есть до проверки B оно не дойдет, если не выполнилось условие A.
Именно это пример и иллюстрирует. В записи с && это не наглядно. Это логично, понятно, будет работать и прочее, но это не наглядно. Вот вся суть примера.
0
05.07.2013, 10:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 10:18
Привет! Вот еще темы с ответами:

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

Написать программу вычисления суммы трех чисел, используя программу вычисления суммы двух чисел - Turbo Pascal
2.Написать программу вычисления суммы трех чисел, используя программу вычисления суммы двух чисел.

вычисления - Pascal
y=arctg(x)+ln*sqrt((1+x)/(1-x))+e в степени X, где x= (1-sin(m))/sqr(A1) A1= (cos(b/А2))/b A2= фигурная скобка 1 строка:...

Вычисления - Turbo Pascal
Решите пожалуйста!Найдите значение выражения:Y=3+6+...+96+99. заранее спасибо!


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

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