Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальные переменные, опасны? Нужны? 
V
    Опции темы
Rickert
Дата 17.3.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Ну вообщем, я не собираюсь тратить время и доказывать свою точку зрения людям, которые принципиально не хотят "слазить с насиженного". Всем удачи smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 17.3.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



с глобальными переменными (и синглтонами) есть еще одни грабли... (наступал лично smile )

пусть есть глобальная переменная для записи данных в лог - CLogger Log;

и есть еще одна глобальная переменная, нужная для того что-бы что- то проинициализировать...

Код

namespace 
{
    ///Initialize windows sockets library
    class SocketsLibrary
    {
        WSADATA m_wsadata;
    public:
        SocketsLibrary()
        {
            int op_result = ::WSAStartup(MAKEWORD(2,2), &m_wsadata);
            if (op_result != 0)
            {
                throw detail::EFailure(op_result, "WSAStartup error");//умереть нах
            }        
        }
        ~SocketsLibrary()
        {
            WSACleanup();
        }
    };

    SocketsLibrary wsock_inst;//initializer instance
};


я как-то раз по наивности добавил в конструктор этого объекта вывод в лог

Код

        SocketsLibrary()
        {      Log.Write("bugaga");
            int op_result = ::WSAStartup(MAKEWORD(2,2), &m_wsadata);
            if (op_result != 0)
            {
                throw detail::EFailure(op_result, "WSAStartup error");//умереть нах
            }        
        }


последствия были плачевны, так-как переменная Log еще не была создана во время создания переменной wsock_inst...

Цитата(MAKCim @  17.3.2008,  09:44 Найти цитируемый пост)
меня просто умиляет позиция "табу" на глобальные переменные  smile 


да нет никакого табу...  smile , глобальные объекты должны быть глобальными, не важно что это - переменная константа или синглтон... просто чем таковых меньше тем проще...

PM MAIL Skype GTalk   Вверх
SABROG
Дата 17.3.2008, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(Lazin @  17.3.2008,  11:28 Найти цитируемый пост)
//умереть нах

Цитата(Lazin @  17.3.2008,  11:28 Найти цитируемый пост)
последствия были плачевны, так-как переменная Log еще не была создана во время создания переменной wsock_inst...


Это наверно косяк проектирования, т.е. надо в нужной последовательности все инициализировать, где нить сразу после main или в конструкторе класса главного окна smile


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 17.3.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



SABROG, вся прелесть глобальных объектов в том, что неизвестно в какой последовательности они инициализируются.
Синглтоны призваны решить эту проблему. Подобные классы нужно инициализировать не глобально (у них же есть статический метод, доступный отовсюду), а в main() например, и в требуемой последовательности. Это позволяет вообще отказаться от глобальных переменных.
PM   Вверх
Alek86
Дата 17.3.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(bsa @  17.3.2008,  11:57 Найти цитируемый пост)
Подобные классы нужно инициализировать ... в требуемой последовательности

зачем в последовательности?
вся прелесть синглтона в том, что вообще о последовательности думать не нужно. "вызываешь" переменные через функции, и все. Что еще не инициализированно на тот момент и тебуется, само проинициализируется...


--------------------
user posted image    user posted image
PM MAIL   Вверх
SABROG
Дата 17.3.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(Alek86 @  17.3.2008,  12:01 Найти цитируемый пост)
Что еще не инициализированно на тот момент и тебуется, само проинициализируется... 


Ну значит у Lazina синглтон не правильно построен, насколько я помню там вызов всех методов таким образом происходит:

Код

className->Instance()->write();


Где Instance() как раз инициализирует новый экземпляр класса и возвращает указатель, либо использует старый, если инициализация уже где-то была.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
MAKCim
Дата 17.3.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(vinter @  17.3.2008,  10:29 Найти цитируемый пост)
Максим но все же лучше использовать static члены класса\структуры чем глобальные переменные, принцип тот же, а ошибок можно получить в разы меньше..

засчет чего?
Earnest тут права, суть одна и та же
Цитата(Alek86 @  17.3.2008,  10:44 Найти цитируемый пост)
ну подскажи, плиз, в какой ситуации глобальные переменные (не константы) выигрывают у тех же статиков с функциями доступа?

с функциями доступа в любой ситуации
без - аналогичны глобальным переменным


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Lazin
Дата 17.3.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(SABROG @  17.3.2008,  12:06 Найти цитируемый пост)
Ну значит у Lazina синглтон не правильно построен

у меня там только глобальные переменные, никаких синглтонов))
если-бы log был синглтоном то да, такой проблемы-бы не возникло...
PM MAIL Skype GTalk   Вверх
Alek86
Дата 17.3.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(MAKCim @  17.3.2008,  12:20 Найти цитируемый пост)
с функциями доступа в любой ситуации
без - аналогичны глобальным переменным

в смысле, если в классе Globals приватный статик, который имеет функцию доступа, то он хуже глобальной переменной?

Добавлено @ 12:24
где траву берешь? ;)

Добавлено @ 12:26
Цитата(Lazin @  17.3.2008,  12:22 Найти цитируемый пост)
если-бы log был синглтоном то да, такой проблемы-бы не возникло...

ты же говорил
Цитата(Lazin @  17.3.2008,  11:28 Найти цитируемый пост)
с глобальными переменными (и синглтонами) есть еще одни грабли... (наступал лично  )

 smile 
чето я не врублюсь - наверна выспаться нужно

Это сообщение отредактировал(а) Alek86 - 17.3.2008, 12:27


--------------------
user posted image    user posted image
PM MAIL   Вверх
MAKCim
Дата 17.3.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alek86 @  17.3.2008,  12:24 Найти цитируемый пост)
в смысле, если в классе Globals приватный статик, который имеет функцию доступа, то он хуже глобальной переменной?

давай определимся, что значит хуже
я говорю с позиции производительности
Цитата(Alek86 @  17.3.2008,  12:24 Найти цитируемый пост)
где траву берешь? ;)

Могилевская 5/1/50


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 17.3.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(MAKCim @  17.3.2008,  12:30 Найти цитируемый пост)
я говорю с позиции производительности

а я говорю с позиции нормального компилятора, который мелкие функции (делегирование и т.п.) инлайнит
если кто-то использует допотопный компилер (и он не догадается при этом поставить inline), то у него будет 0,1% уменьшение поизводительности, но, поскольку их щас почти никто не использует...

хотя, если юзать синглтон, то небольшое падение производительности будет
но альтернатива - ипаться с временем жизни - имхо, хуже

Это сообщение отредактировал(а) Alek86 - 17.3.2008, 12:44


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 17.3.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(MAKCim @  17.3.2008,  13:20 Найти цитируемый пост)
засчет чего?

засчет не замещения глобальной статик члена - переменной, локальной и подавление проблем связанных с этим 


--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 17.3.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Alek86 @ 17.3.2008,  12:01)
зачем в последовательности?
вся прелесть синглтона в том, что вообще о последовательности думать не нужно. "вызываешь" переменные через функции, и все. Что еще не инициализированно на тот момент и тебуется, само проинициализируется...

А как удалять этот класс? ты об этом подумал? Или ты его не удаляешь?
PM   Вверх
SABROG
Дата 17.3.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(bsa @ 17.3.2008,  12:53)
Цитата(Alek86 @ 17.3.2008,  12:01)
зачем в последовательности?
вся прелесть синглтона в том, что вообще о последовательности думать не нужно. "вызываешь" переменные через функции, и все. Что еще не инициализированно на тот момент и тебуется, само проинициализируется...

А как удалять этот класс? ты об этом подумал? Или ты его не удаляешь?

А для чего удалять синглтон ? Насколько я понимаю смысл в том, чтобы он "оживал" в момент старта программы и "помирал" при выходе. А там уже сама ОС его зарубит. Я правда не знаю вызовется ли деструктор в этом случае, не работал с синглтонами, паттерны проектирования для меня пока темный лес, как и вообще тема классов в целом.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Lazin
Дата 17.3.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Alek86 @  17.3.2008,  12:24 Найти цитируемый пост)
чето я не врублюсь - наверна выспаться нужно


Цитата(Alek86 @  17.3.2008,  12:24 Найти цитируемый пост)
если-бы log был синглтоном то да, такой проблемы-бы не возникло...

ты же говорил
Цитата(Lazin @  17.3.2008,  11:28 Найти цитируемый пост)
с глобальными переменными (и синглтонами) есть еще одни грабли... (наступал лично  )

 smile 
чето я не врублюсь - наверна выспаться нужно


если-бы я в своем примере написал

Код

       ~SocketsLibrary()
        {
            Log.Write("bugaga");
            WSACleanup();
        }

то не факт что работало-бы, даже если-бы Log был реализован как синглтон

Добавлено через 2 минуты и 3 секунды
Цитата(bsa @  17.3.2008,  12:53 Найти цитируемый пост)
А как удалять этот класс? ты об этом подумал? Или ты его не удаляешь? 

кажется мы об одном и том-же)))
Цитата(SABROG @  17.3.2008,  13:09 Найти цитируемый пост)
Я правда не знаю вызовется ли деструктор в этом случае

вызывается, и если деструктор использует другой глобальный объект, то тут опять грабли)), почитать об этом можно у Александресску...
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0983 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.