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

Ленивая инициализация! - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
12.06.2013, 22:40     Ленивая инициализация! #1
Объясните пожалуйста реальный пример применения ленивой инициализации.Можно с листингом простой программы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2013, 22:40     Ленивая инициализация!
Посмотрите здесь:

Инициализация переменной C++
В-деревья,инициализация C++
инициализация C++
C++ инициализация значений
C++ инициализация класса С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 11:12  [ТС]     Ленивая инициализация! #21
а можно подробно объяснить этот код?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.06.2013, 11:14     Ленивая инициализация! #22
Dgiu66, Есть платеж. При создании платежа карта в классе не инициализирована. Достается карта из базы ТОЛЬКО по требованию (при первом вызове get_card()).
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 11:44  [ТС]     Ленивая инициализация! #23
а в программе без ленивой инициализации как происходят действия? допустим нам нужна что-то посчитать из математики, как происходит без ленивой инициализации, а как с инициализацией?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.06.2013, 12:00     Ленивая инициализация! #24
Dgiu66, А мозг включить хоть чуть-чуть? Хороший пример отложенных вычислений показывает std::future.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <thread>
#include <future>
 
int calculate()
{
   std::cout << "Time to sleep" << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(1));
   std::cout << "Wakeup" << std::endl;
   return 42;
}
 
int main()
{
   std::future<int> future = std::async(calculate);
   std::cout << "Future created, but not called" << std::endl;
   std::cout << "Call get on future" << std::endl;
   std::cout << "Result is: " << future.get() << std::endl;
}
До тех пор пока не вызовем future.get() функция вызвана не будет.
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 12:07  [ТС]     Ленивая инициализация! #25
а расписать можно подробно
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
14.06.2013, 12:16     Ленивая инициализация! #26
Цитата Сообщение от Dgiu66 Посмотреть сообщение
а расписать можно подробно
забей на это. Изучай программирование сам последовательно от простого к сложному. Если тебе эта инициализация не нужна пока, можешь не грузиться ей. Просто изучай язык! А то у меня подозрение, что ты С++ на прошлой неделе учить стал, основы не до конца изучил, а отвлекаешься уже на посторонние вопросы.
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 12:19  [ТС]     Ленивая инициализация! #27
не в этом дело, мне на зачёт нужно ответить эту тему сегодня, препод сказал привести реальный пример с ленивой инициализацией.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
14.06.2013, 12:23     Ленивая инициализация! #28
Цитата Сообщение от Dgiu66 Посмотреть сообщение
не в этом дело, мне на зачёт нужно ответить эту тему сегодня, препод сказал привести реальный пример с ленивой инициализацией.
Да брось ты эту учёбу. Бессмысленно тратить время на то, что не нравится.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.06.2013, 12:25     Ленивая инициализация! #29
Dgiu66, ЧТО подробно расписывать? Ленивые вычисления подразумевают, что вычисление производится ТОЛЬКО тогда, когда нужен непосредственно результат. Все примеры здесь приведенные так или иначе относились к ленивости, идиома CoW - тоже является проявлением ленивости, полное копирование объекта идет исключительно при надобности.

На тему примера с future. Создается объект future с callable параметром. Но функция, переданная в объект не вызывается до тех пор, пока нам не нужен будет результат (до тех пор пока не вызовем функцию get).
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.06.2013, 15:12     Ленивая инициализация! #30
Цитата Сообщение от ForEveR Посмотреть сообщение
До тех пор пока не вызовем future.get() функция вызвана не будет.
Как это не будет вызвана? А в чем смысл тогда async, если он не стартует до вызова get()?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <thread>
#include <future>
 
int calculate()
{
   std::cout << "Time to sleep" << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(1));
   std::cout << "Wakeup" << std::endl;
   return 42;
}
 
int main()
{
   std::future<int> future = std::async(calculate);
   std::cout << "Future created, but not called" << std::endl;
   std::cout << "Call get on future" << std::endl;
   //std::cout << "Result is: " << future.get() << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(5));
}
VS 2012 - всё вызывает.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.06.2013, 15:18     Ленивая инициализация! #31
Tulosba, Параметр launch не указан, потому выбирается имплементацией. Видимо в VS - launch::async. А в gcc - launch::deferred.
Bash
1
2
3
./new 
Future created, but not called
Call get on future
async можно убрать, чтобы не смущал.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <thread>
#include <future>
 
int calculate()
{
   std::cout << "Time to sleep" << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(1));
   std::cout << "Wakeup" << std::endl;
   return 42;
}
 
int main()
{
   std::packaged_task<int()> task(&calculate);
   std::future<int> future = task.get_future();
   std::cout << "Future created, but not called" << std::endl;
   std::cout << "Call get on future" << std::endl;
   //std::cout << "Result is: " << future.get() << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(5));
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.06.2013, 15:28     Ленивая инициализация! #32
ForEveR, так task не начнет выполняться пока operator() на нем не вызывать. Насчет launch не знаю. Мало изученная пока область. Надо почитать. Но разница налицо.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.06.2013, 15:33     Ленивая инициализация! #33
Tulosba, Согласен. Косячу.
Сделаем тогда проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <thread>
#include <future>
 
int calculate()
{
   std::cout << "Time to sleep" << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(1));
   std::cout << "Wakeup" << std::endl;
   return 42;
}
 
int main()
{
   std::future<int> future(std::async(std::launch::deferred, calculate));
   std::cout << "Future created, but not called" << std::endl;
   std::cout << "Call get on future" << std::endl;
   //std::cout << "Result is: " << future.get() << std::endl;
   std::this_thread::sleep_for(std::chrono::seconds(5));
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.06.2013, 15:40     Ленивая инициализация! #34
Цитата Сообщение от ForEveR Посмотреть сообщение
Сделаем тогда проще
Вот так уже универсальнее будет
Только, насколько я понял, при deferred вызов возможен исключительно в текущем потоке:
Instead, lazy evaluation is performed: the first call to a non-timed wait function on the std::future that async returned to the caller will cause f(args...) to be executed in the current thread.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2013, 15:41     Ленивая инициализация!
Еще ссылки по теме:

инициализация объекта C++
C++ Инициализация указателей
C++ Инициализация указателей

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.06.2013, 15:41     Ленивая инициализация! #35
Tulosba, Да, при launch::deferred нового потока не создается.
Yandex
Объявления
14.06.2013, 15:41     Ленивая инициализация!
Ответ Создать тему
Опции темы

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