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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
#1

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

12.06.2013, 22:40. Просмотров 2266. Ответов 34
Метки нет (Все метки)

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

Инициализация - C++
1. Создать класс Solid 2. Его наследует Planet 3. В функции Gravitation используются объекты Solid Это все .h и .cpp библиотеки 4....

Инициализация вектора - C++
Как правильно инициализировать двумерный символьный вектор? Пробовал вот так, не получилось vector< vector<char> > map(2,...

Инициализация структур - C++
Не могу уловить по какой причине первый вариант рабочий: А этот нет:

Инициализация матрицы - C++
Здравствуйте. В 9 строчке где только }; написано выдается ошибка: variable-sized object 'matr' may not be initialized. Что может быть не...

Инициализация указателей - C++
Добрый вечер, объясните пожалуйста, что значит присвоение начальных значений указателям, как например в данном случае: float *fPtr =...

Инициализация строки - C++
Добрый день, такое дело: имеется инициализация char* str1 = "x"; // lvalue - char*, rvalue = const char такая инициализация есть...

Инициализация в private - C++
Объясните пожалуйста в чем собственно заключается ошибка и как ее исправить. Зарание спасибо class Menu{ private: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2013, 22:47     Ленивая инициализация! #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <cstdlib>
 
class Lazy
{
public:
    Lazy( ) : computed(false) {}
    int get()
    {
        if( !computed )
        {
            value = 42; // какие-то сложные вычисления 
            computed = true;
        }
        return value;
    }
private:
    bool computed;
    int value;
};
 
int main()
{
    Lazy l;
 
    std::cout << l.get() << std::endl;
 
    std::system( "pause" ); 
}
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
12.06.2013, 22:56  [ТС]     Ленивая инициализация! #3
А можно узнать реальное использование данного метода
Убежденный
Системный программист
Эксперт С++
15298 / 6930 / 1096
Регистрация: 02.05.2013
Сообщений: 11,340
Завершенные тесты: 1
12.06.2013, 23:17     Ленивая инициализация! #4
Цитата Сообщение от Dgiu66 Посмотреть сообщение
Объясните пожалуйста реальный пример применения ленивой инициализации.
Ленивая инициализация - это частный случай более общего понятия, называется
"ленивые вычисления" (lazy evaluations) или "отложенные вычисления".
Смысл в том, чтобы отложить какие-то действия, например создание объекта или
определенные вычисления, до того момента, когда это реально потребуется.

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

Обычно реализация данного паттерна тривиальна, но если программа многопоточная, то
lazy-объекты и lazy-данные должны быть защищены от одновременного "создания"
двумя или более потоками одновременно.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
12.06.2013, 23:19     Ленивая инициализация! #5
Конечно можно.
Допустим, у нас есть класс string и объект этого класса str.
Мы передаем в функцию копию str, но в конструкторе копирования этого класса используется ленивая инициализация, и память под новую строку не выделяется, а просто используется память оригинального объекта str. В случае, если в функции эта строка не изменяется, то и выделять новую память по сути смысла нет - лишняя трата ресурсов. А при первой попытке изменения данных, память будет выделена для новой строки и данные из объекта-оригинала будут скопированы
Достаточно примитивный пример, но многие реализации строк именно так и выглядят
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.06.2013, 23:33     Ленивая инициализация! #6
Croessmah, емнип в многопоточных средах этот подход себя не оправдал.
Убежденный
12.06.2013, 23:34
  #7

Не по теме:


Croessmah, хоть это и lazy, оно все-таки ближе к Copy-On-Write.

Croessmah
12.06.2013, 23:37
  #8

Не по теме:

Tulosba, в многопоточности многое что себя не оправдало, да и до недавнего времени даже в стандарте многопоточность не жаловали но мир меняется

Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
13.06.2013, 22:35  [ТС]     Ленивая инициализация! #9
Croessmah а ещё код к этому описанию закиньте пожалуйста
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
13.06.2013, 23:34     Ленивая инициализация! #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Допустим, у нас есть класс string и объект этого класса str.
Мы передаем в функцию копию str, но в конструкторе копирования этого класса используется ленивая инициализация, и память под новую строку не выделяется, а просто используется память оригинального объекта str. В случае, если в функции эта строка не изменяется, то и выделять новую память по сути смысла нет - лишняя трата ресурсов. А при первой попытке изменения данных, память будет выделена для новой строки и данные из объекта-оригинала будут скопированы
Пример в студию! Честно говоря я мало понял из этих слов...

Про многопоточность тоже не понял... Можно не приводить аргументов без фактов!?..
.. а то все как-то растекается мыслью по древу...

Добавлено через 21 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Мы передаем в функцию копию str, но в конструкторе копирования ...
Откуда в функции конструктор копирования?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2013, 23:42     Ленивая инициализация! #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от lazybiz Посмотреть сообщение
Честно говоря я мало понял из этих слов...
copy on write - при копировании объекты копируются поверхностно и при попытке модифицировать копию будет выполнено полное копирование т.е. модификация произойдет уже с копией. Нет модификаци - нет полного копирования.
На примере со строкой это выглядит так:
при поверхностном копировании (shallow copy) - будет скопирован лишь указатель на строку;
полное копирование (deep copy) - будет выделена новая память в которую скопируют строку.

Добавлено через 39 секунд
Цитата Сообщение от lazybiz Посмотреть сообщение
Пример в студию!
примеры в гугле
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 00:01  [ТС]     Ленивая инициализация! #12
а найти что-небудь конкретное можно с кодом не сложным и с подробным объяснением какой пример реальный срочно нужно

Добавлено через 13 минут
а именно само отличие программы с ленивой инициализацией от обычной
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.06.2013, 00:05     Ленивая инициализация! #13
Цитата Сообщение от Dgiu66 Посмотреть сообщение
а именно само отличие программы с ленивой инициализацией от обычной
вам уже ответили:
Цитата Сообщение от Убежденный Посмотреть сообщение
Это позволяет ускорить запуск программы, а также избежать создания объектов
или данных, которые до определенного момента не задействованы.
Dgiu66
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 00:18  [ТС]     Ленивая инициализация! #14
я понимаю что оно даёт, я не понимаю сам смысл действия программы, отложить действия до момента когда это необходимо, а без ленивой инициализации как эти действия выполняются?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2013, 00:40     Ленивая инициализация!
Еще ссылки по теме:

Инициализация ссылок - C++
Пусть T - это некоторый класс. Хотелось бы знать, всегда ли такой код приемлем. extern int function1(T); extern int function2(T&amp;);...

Инициализация даты - C++
Есть класс Date для работы с датами. Необходимо реализовать такую инициализацию даты: ввод строкой вида &quot;гггг.мм.дд&quot;, а на экран должно...

Инициализация ссылок - C++
Непонятно почему такой синтаксис инициализации ссылок ошибочен: int * p(nullptr); int * &amp;pref(p); Требуется вот так: int *...

инициализация значений - C++
Всем привет! #include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;windows.h&gt; #include&lt;math.h&gt; #include&lt;string&gt; class Money { ...

Инициализация в структуре - C++
const int len=30; const int size=5; struct stud { char name= &quot;Olga Mironova&quot;, &quot;Mihail Mihailov&quot;, &quot;Vladimir...


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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.06.2013, 00:40     Ленивая инициализация! #15
Цитата Сообщение от Dgiu66 Посмотреть сообщение
а без ленивой инициализации как эти действия выполняются?
действия выполняются всегда одинаково, разница в моменте выполнения этих действий
Yandex
Объявления
14.06.2013, 00:40     Ленивая инициализация!
Ответ Создать тему
Опции темы

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