Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
1

Ленивая инициализация!

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

Author24 — интернет-сервис помощи студентам
Объясните пожалуйста реальный пример применения ленивой инициализации.Можно с листингом простой программы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2013, 22:40
Ответы с готовыми решениями:

Инициализация
Дана структура с вложенной в нее структурой: struct patients { struct {day,month,year}; string...

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

инициализация класса С++
Создать класс вектор, содержащий ссылку на int, размерность вектора и переменную ошибки. Класс...

Инициализация в структуре
const int len=30; const int size=5; struct stud { char name= "Olga Mironova", ...

34
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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" ); 
}
3
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
12.06.2013, 22:56  [ТС] 3
А можно узнать реальное использование данного метода
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
12.06.2013, 23:17 4
Цитата Сообщение от Dgiu66 Посмотреть сообщение
Объясните пожалуйста реальный пример применения ленивой инициализации.
Ленивая инициализация - это частный случай более общего понятия, называется
"ленивые вычисления" (lazy evaluations) или "отложенные вычисления".
Смысл в том, чтобы отложить какие-то действия, например создание объекта или
определенные вычисления, до того момента, когда это реально потребуется.

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

Обычно реализация данного паттерна тривиальна, но если программа многопоточная, то
lazy-объекты и lazy-данные должны быть защищены от одновременного "создания"
двумя или более потоками одновременно.
2
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
12.06.2013, 23:19 5
Конечно можно.
Допустим, у нас есть класс string и объект этого класса str.
Мы передаем в функцию копию str, но в конструкторе копирования этого класса используется ленивая инициализация, и память под новую строку не выделяется, а просто используется память оригинального объекта str. В случае, если в функции эта строка не изменяется, то и выделять новую память по сути смысла нет - лишняя трата ресурсов. А при первой попытке изменения данных, память будет выделена для новой строки и данные из объекта-оригинала будут скопированы
Достаточно примитивный пример, но многие реализации строк именно так и выглядят
2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2013, 23:33 6
Croessmah, емнип в многопоточных средах этот подход себя не оправдал.
0
Убежденный
12.06.2013, 23:34
  #7

Не по теме:


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

0
Croessmah
12.06.2013, 23:37
  #8

Не по теме:

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

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

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

Добавлено через 21 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Мы передаем в функцию копию str, но в конструкторе копирования ...
Откуда в функции конструктор копирования?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.06.2013, 23:42 11
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от lazybiz Посмотреть сообщение
Честно говоря я мало понял из этих слов...
copy on write - при копировании объекты копируются поверхностно и при попытке модифицировать копию будет выполнено полное копирование т.е. модификация произойдет уже с копией. Нет модификаци - нет полного копирования.
На примере со строкой это выглядит так:
при поверхностном копировании (shallow copy) - будет скопирован лишь указатель на строку;
полное копирование (deep copy) - будет выделена новая память в которую скопируют строку.

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

Добавлено через 13 минут
а именно само отличие программы с ленивой инициализацией от обычной
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.06.2013, 00:05 13
Цитата Сообщение от Dgiu66 Посмотреть сообщение
а именно само отличие программы с ленивой инициализацией от обычной
вам уже ответили:
Цитата Сообщение от Убежденный Посмотреть сообщение
Это позволяет ускорить запуск программы, а также избежать создания объектов
или данных, которые до определенного момента не задействованы.
0
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 00:18  [ТС] 14
я понимаю что оно даёт, я не понимаю сам смысл действия программы, отложить действия до момента когда это необходимо, а без ленивой инициализации как эти действия выполняются?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.06.2013, 00:40 15
Цитата Сообщение от Dgiu66 Посмотреть сообщение
а без ленивой инициализации как эти действия выполняются?
действия выполняются всегда одинаково, разница в моменте выполнения этих действий
0
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 02:20  [ТС] 16
в какой момент выполняется без ленивой инициализании, а в какой с ленивой?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.06.2013, 02:23 17
Dgiu66, написано же. "Без" при конструировании объекта - "с" лишь при обращении к нужному методы
0
0 / 0 / 0
Регистрация: 12.06.2013
Сообщений: 11
14.06.2013, 02:42  [ТС] 18
а по подробней?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.06.2013, 03:20 19
Цитата Сообщение от Dgiu66 Посмотреть сообщение
а по подробней?
а поподробней пишется слитно
Что может быть тривиальней примера Ленивая инициализация!
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
14.06.2013, 09:31 20
У нас в частности, lazy инициализация используется для чтения из базы исключительно когда это нужно. Схематичный пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <boost/shared_ptr.hpp>
 
class ccard_impl;
typedef boost::shared_ptr<ccard_impl> ccard;
 
class Payment
{
public:
   ccard get_card() const
   {
      if (!card)
      {
         // load card from db
      }
      return card;
   }
private:
   mutable ccard card;
};
0
14.06.2013, 09:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2013, 09:31
Помогаю со студенческими работами здесь

Правильная инициализация ?
Здравствуйте уважаемые программисты! Мне необходимо описать два класса, один ArrayOfInt - якобы...

инициализация указателя
class Item { public: Item() { num0=new char(&quot;как&quot;);//ошибка cannot convert from 'const...

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

Инициализация переменных С++11
Форумчане, подскажите в чем существенная разница ставить знак равенства &quot;=&quot; или нет (я понимаю что...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru