Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Глобальные переменные


Автор: Rickert 15.3.2008, 10:57
Где-то слышал, что нужно избегать глобальных переменных вообще.
Правда ли и почему?

Автор: Alek86 15.3.2008, 11:27
Избегать нужно глобальных неконстантных переменных, ибо их изменение сложно отследить

Число Пи лучше сделать глобальной константой...

Автор: archimed7592 15.3.2008, 11:35
Цитата(Rickert @  15.3.2008,  10:57 Найти цитируемый пост)
Правда ли и почему? 


Rickert, ну а ты попробуй придумать сценарий, при котором глобальные переменные будут хорошим решением ;).

Автор: Rickert 15.3.2008, 11:51
archimed7592, разработка игр. Глобальные переменные: системные установки, игровой мир, профиль игрока. Теже системные установки необходимы для инициализации окна и обработки событий.

Автор: vinter 15.3.2008, 11:59
Цитата(Rickert @  15.3.2008,  12:51 Найти цитируемый пост)
archimed7592, разработка игр. Глобальные переменные: системные установки, игровой мир, профиль игрока. Теже системные установки необходимы для инициализации окна и обработки событий.

так зачем им быть глобальными? можно сделать классы которые будут отвечать за конкретную часть интерфейса инициализации. Можно их сделать статическими внутри классов.

Автор: Rickert 15.3.2008, 12:42
Корчое ясно. Всем спасибо!

Автор: Alek86 15.3.2008, 12:56
Цитата(archimed7592 @  15.3.2008,  11:35 Найти цитируемый пост)
Rickert, ну а ты попробуй придумать сценарий, при котором глобальные переменные будут хорошим решением

уточню - ты о ЛЮБЫХ глобальных переменных?
имхо, я предложил 1 из сценариев, когда глобальная переменная - самое лучшее решение. ну можно еще в неймспейс Math какой-нить обернуть...

Автор: MAKCim 15.3.2008, 15:05
Цитата(Rickert @  15.3.2008,  10:57 Найти цитируемый пост)
Где-то слышал, что нужно избегать глобальных переменных вообще.
Правда ли и почему? 

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


Автор: Dmi3ev 15.3.2008, 15:49
если можешь, обходись без них.
если не можешь, КОНЕЧНО СТОИТ ИСПОЛЬЗОВАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ.
ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ НЕ ЯВЛЯЮТСЯ ПЛОХИМИ. ПРОСТО НАДО БЫТЬ ОСТОРОЖНЫМ.
1
ЕСЛИ ДОПУСТИМ У ТЕБЯ ЕСТЬ ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ А И В ФУНКЦИИ ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ А, ТО ДЕЙСТВИЕ ГЛОБАЛЬНОЙ ПЕРЕМЕННОЙ ПЕРЕКРОЕТСЯ ЛОКАЛЬНОЙ ПЕРЕМЕННОЙ (В ЭТОЙ ФУНКЦИИ)
2
СЛОЖНО ОТСЛЕЖИВАТЬ ИЗМЕНЕНИЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ

ОДНАКО ЕСЛИ ЕСТЬ МНОГО ПЕРЕМЕННЫХ, КОТОРЫЕ НАДО ПЕРЕДАВАТЬ ИЗ ФУНКЦИИ В ФУНКЦИЮ, ТО Я, НАПРИМЕР, ИСПОЛЬЗУЮ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ.

Автор: MAKCim 15.3.2008, 16:12
Dmi3ev

M
MAKCim
Используйте заглавные буквы по назначению!

Автор: archimed7592 16.3.2008, 02:46
Цитата(Alek86 @  15.3.2008,  12:56 Найти цитируемый пост)
уточню - ты о ЛЮБЫХ глобальных переменных?
имхо, я предложил 1 из сценариев, когда глобальная переменная - самое лучшее решение. ну можно еще в неймспейс Math какой-нить обернуть... 

Угу, о любых. Любой объект помимо своего глобального использования ещё имеет этапы инициализации и финализации, которые необходимо контролировать(как моменты свершения этих этапов, так и процесс их протекания). Без этого контроля глобальная переменная такая же полезная вещь, как, к примеру, неинициализированная локальная переменная. Сразу оговорюсь, что константа - это не переменная smile.


Цитата(Rickert @  15.3.2008,  11:51 Найти цитируемый пост)
archimed7592, разработка игр. Глобальные переменные: системные установки, игровой мир, профиль игрока.

Возможно, что многих моё мнение шокирует, но, всё же я его выскажу(постараюсь наиболее деликатно).
Производство ПО - это целая отрасль в промышленности со своей спецификой, требованиями, ньюансами, etc.
В этой самой отрасли есть много разных областей, где правят свои законы. Дык вот, самые большие области - это enterprise & small business: в этих областях секрет успешных проектов заключается в искусстве наиболее эффективно производить легко поддерживаемое ПО, т.е. задачи всего три: 1) потратить наименьшее кол-во ресурсов(время+деньги); 2) уметь подстраивать проект также быстро, как меняются требования заказчика; 3) итоговый проект должен поддаваться поддержке минимальными силами(те же время и деньги).
Также есть др. маленькие области, но я упомяну лишь одну, а именно компьютерные игры: в этой области секрет успешных проектов заключается в искусстве максимально быстро производить полотна неподдерживаемого кода у которого всего две задачи: 1) работать; 2) жрать минимум компьютерных ресурсов. Точнее говоря, это не обязательно должны быть полотна и не обязательно неподдерживаемый код, но ввиду жесткой конкуренции получаются именно полотна и именно неподдерживаемого кода smile.
Большинство правил хорошего тона в программировании(аля "global variables is evil") просто напросто не нужны разработчикам КИ. Я не пытаюсь обидеть разработчиков игр - это просто констатация факта, которому, кстати есть простое объяснение smile. Дело в том, что, если взять, к примеру, сложную ERP/CRM. Вот заказывает крупный клиент такую систему, получает её за круглую сумму, после чего переодически выкладывает круглые суммы за развитие этой системы(параллельно с развитием его бизнеса и, соответственно, требований) и вполне можно понять, что он хочет выложить 100 у.е. и потерять 1 месяц единожды(за разработку), после чего доплачивать по 10 у.е. за поддержку(доработку) и терять около 2-3 дней, чем заплатить 50 у.е. единожды и получить результат за 2 недели, но впоследствии не иметь возможностей доработки системы... точнее говоря он имеет таковую возможность, но только в виде "заплати нам ещё раз 50 у.е. и подожди ещё 2 недели - мы добавим нужную тебе кнопку". И сравните это с КИ: вышла игрушка, побегали, пострелялись, забыли и главное, чтобы она окупилась, она должна быть интересной, красивой, и работать на большинстве компьютеров. В итоге получается, что разработчику КИ порой проще воспользоваться глобальной переменной, чем сингтоном или чем вообще максимально локализовать это состояние.

Автор: korian 16.3.2008, 03:11
archimed7592
соглашусь тока для маленьких игр, причем для компаний однодневок  smile 
во-первых потому, шо если компания постоянно занимается КИ, то повторно используемый код им необходим.
а во-вторых, потому шо такое детище как WOW, написать и шоб оно работало (а они его еще и поддерживают, дорабатывают)... без соблюдений правил имху не реально
плюс как многие пишут, правильно написанную прогу сделать более быстрой - обычно легко
а сделать более быструю прогу правильной - обычно трудно

Автор: Rickert 16.3.2008, 06:21
Цитата(archimed7592 @  16.3.2008,  02:46 Найти цитируемый пост)
Также есть др. маленькие области, но я упомяну лишь одну, а именно компьютерные игры: в этой области секрет успешных проектов заключается в искусстве максимально быстро производить полотна неподдерживаемого кода у которого всего две задачи: 1) работать; 2) жрать минимум компьютерных ресурсов. Точнее говоря, это не обязательно должны быть полотна и не обязательно неподдерживаемый код, но ввиду жесткой конкуренции получаются именно полотна и именно неподдерживаемого кода 

Нет, ты ошибаешься, поверь мне. Сейчас компании ведут политику направленную на разработку движков максимально-расширяемых. То бишь движки наращивают мышцы до такой степени, что на их основе можно было делать новые игры. Разработчики КИ живут ныне продажей движков больше, чем самими играми. Сравнить, 3 года назад движок ку3 стоил 500k$, сейчас движок doom3 стоит порядка 2kk$

Автор: vinter 16.3.2008, 10:00
archimed7592, голословное утверждение, которые ты не сможешь ничем подтвердить, и я уверен что ты не прав smile 
Если бы все писали "лишь бы работало", то ни о каких аддонах изменяющих функционал и речи бы быть не могло.

Автор: archimed7592 16.3.2008, 11:09
Rickertvinter, извиняюсь, я забыл дописать, что спорить на этот счёт у меня нет ни времени, ни какого-либо желания.

Цитата(Rickert @  16.3.2008,  06:21 Найти цитируемый пост)
2kk$

Уй ты госпади, а 2 кк - это что, предел мечтаний? Ну сколько у них будет продаж движка? И сколько они поимеют с продажи самого дума?

Автор: Rickert 16.3.2008, 11:14
archimed7592, а теперь посмотри сколько уже народа купило движок unreal 3 и сколько куплено копий того ж gears of war.

Автор: vinter 16.3.2008, 11:20
Цитата(archimed7592 @  16.3.2008,  12:09 Найти цитируемый пост)
Rickert, vinter, извиняюсь, я забыл дописать, что спорить на этот счёт у меня нет ни времени, ни какого-либо желания.

я думаю ты еще забыл добавить "ни аргументов"

Автор: mes 16.3.2008, 14:03
Цитата(Rickert @  16.3.2008,  06:21 Найти цитируемый пост)
стоил 500k$, сейчас движок doom3 стоит порядка 2kk$ 

извините за оффтопик и неграммотность, но 500k$ и 2kk$ это сколько в нормальной (у.е.) валюте?

Автор: vinter 16.3.2008, 14:08
Цитата(mes @  16.3.2008,  15:03 Найти цитируемый пост)
извините за оффтопик и неграммотность, но 500k$ и 2kk$ это сколько в нормальной (у.е.) валюте?

к это 000

Автор: mes 16.3.2008, 14:14
Цитата(vinter @  16.3.2008,  14:08 Найти цитируемый пост)
к это 000 

спасибо - чуствовал что так, но что то не верилось ... придется поверить ))

Автор: archimed7592 16.3.2008, 15:12
Цитата(vinter @  16.3.2008,  11:20 Найти цитируемый пост)
я думаю ты еще забыл добавить "ни аргументов" 

Да, vinter, я никогда не работал в индустрии КИ и моё мнение - лишь догадки. ОК, а ты работал? А кто работал? smile
Выходит, ни у кого из нас аргументов нет. smile

Автор: Rickert 17.3.2008, 04:47
archimed7592, я занимался разработкой игр, разговаривал и вёл интервью с несколькими реально разрабатывающими движки людьми. Так что можешь мне поверить.
Давай смотреть логично. Взгляни на тот же Crysis и gears of war - два мостодонта, которым нужны 4 ядерные процессоры и triple sly карты от Nvidia + несколько гигов оперативки. Движки, на которых они написаны настолько монструозны, что старшно думать. Но они полностью раширяемы и независимы - из них моржно слепить любую игрушку, и я думаю даже не прибегаю к перекомпиляции исходников, имея на руках только SDK - во всяком случае так можно сделать на движке третьего дума. Помнится когда ещё была якобы-ворованная альфа версия - я сам лично разбирал его движок и писал статьи для doom3.ru - они там ещё есть, можешь почитать. Ищи поиском по автору - [ss]3L33T@ aka Cyber Optik. В данный момент, например, на его основе пишется мод - гонки, переработка на тему Carmageddon'а. Короче о чём я: народ пишет масштабируемые движки, которые стоят хренову тучу бабла и потом начинают его продавать и никто не заботится о производительности: применяют эти дурные (ИМХО! Я сам их применяю, потому что требуют стандарты, будь моя воля я б выкинул все эти stl и дурные правила по инкапсуляции кода. Это ИМХО - не надо на меня нападать!) правила и никто не думает о производительности - вот так и получаются Crysis'ы, которые идут у 25% игроков. КИ - это уже давно как шоу-бизнес - на нём делают деньги, а золотые времена, когда игры приносили удовольствие и восторг от идей - прошли, сейчас единицы способны что-либо придумать.

Автор: Mayk 17.3.2008, 07:32
Цитата(Rickert @  17.3.2008,  08:47 Найти цитируемый пост)
выкинул все эти stl и дурные правила по инкапсуляции кода. Это ИМХО - не надо на меня нападать!)

Это не "имхо". Это бред.

Цитата(Rickert @  17.3.2008,  08:47 Найти цитируемый пост)
archimed7592, я занимался разработкой игр, разговаривал и вёл интервью с несколькими реально разрабатывающими движки людьми. Так что можешь мне поверить.

йа сморел исходнеги кваг и крестиков нолигов, так что можешь мне поверить smile  smile

Добавлено через 6 минут и 29 секунд
Цитата(Rickert @  15.3.2008,  14:57 Найти цитируемый пост)
Правда ли и почему? 

Да потому что они глобальны и могут поменятся в любой момент. Не очень хорошо может сказаться при отладке(мол где ж она изменилась-то?)
(утрированный пример: сравнить
Код

void foo(){for( i = 0; i < 91; ++i ) {bar(); gar(); dar();}}
void bar(){for( i = 0; i < 91; ++i ) {gar();}}

и
Код

void foo(){for( int i = 0; i < 91; ++i ) {bar(); gar(); dar();}}
void bar(){for( int i = 0; i < 91; ++i ) {gar();}}

на кол-во вызовов ф-ций dar();
)
, с многопоточностью плохо подружить.

Цитата(Dmi3ev @  15.3.2008,  19:49 Найти цитируемый пост)
ОДНАКО ЕСЛИ ЕСТЬ МНОГО ПЕРЕМЕННЫХ, КОТОРЫЕ НАДО ПЕРЕДАВАТЬ ИЗ ФУНКЦИИ В ФУНКЦИЮ, ТО Я, НАПРИМЕР, ИСПОЛЬЗУЮ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ. 

ССЗБ

Автор: Rickert 17.3.2008, 08:57
Цитата(Mayk @  17.3.2008,  07:32 Найти цитируемый пост)
Да потому что они глобальны и могут поменятся в любой момент. Не очень хорошо может сказаться при отладке(мол где ж она изменилась-то?)

Программисты стали настолько слабы, что не могу контролировать процесс изменения переменных? Твои слова актуальны для крупных команд разработчиков.
Цитата(Mayk @  17.3.2008,  07:32 Найти цитируемый пост)
Это не "имхо". Это бред.

Я не собираюсь тебя убеждать в чём-то. Делай как знаешь, это было имхо.
Цитата(Mayk @  17.3.2008,  07:32 Найти цитируемый пост)
йа сморел исходнеги кваг и крестиков нолигов, так что можешь мне поверить 

Флаг в руки, транспорант тебе на шею, только между тобой и мной есть очевидная разница.

Автор: vinter 17.3.2008, 08:57
Цитата

когда игры приносили удовольствие и восторг от идей - прошли, сейчас единицы способны что-либо придумать.

не все так печально, если бы все было так то игры бы загнулись давно.
Цитата

 никто не думает о производительности - вот так и получаются Crysis'ы, которые идут у 25% игроков.

а как по твоему NVidia & AMD деньги зарабатывать, зачем тогда нужны слай и кроссфаер? Да и что то я подозреваю, что там не специально сделали неоптимизированный движок, а просто графика движется вперед и жрет все больше ресурсов.

Автор: Lazin 17.3.2008, 09:31
archimed7592
Цитата(Mayk @  17.3.2008,  07:32 Найти цитируемый пост)
Это не "имхо". Это бред

поддерживаю)))

Цитата(Rickert @  17.3.2008,  04:47 Найти цитируемый пост)
Это ИМХО - не надо на меня нападать!) правила и никто не думает о производительности - вот так и получаются Crysis'ы, которые идут у 25% игроков.

да, все из-за STL  smile ,... просто качество графики и задачи решаемые движком этой игры видимо объективно высоки)))
посмотри код Ogre3D или Irrlicht, там хватает и смарт поинтеров и контейнеров и шаблонов))
почитай что пишут профессиональные разработчики игр...

Цитата(Rickert @  17.3.2008,  08:57 Найти цитируемый пост)
Программисты стали настолько слабы, что не могу контролировать процесс изменения переменных? Твои слова актуальны для крупных команд разработчиков.

Я однажды имел счастье доделывать программу, в которой было около 30 глобальных переменных, которые использовались в разных функциях, в итоге получалось так, что меняя что-нибудь в одном месте, ломалось в другом, разные части программы очень сильно друг от друга зависили...
О том что-бы что-то там распараллелить, расширить и тд не могло быть и речи.. короче просто переписал все))) теперь вспоминаю с содроганием...


Цитата(Rickert @  17.3.2008,  08:57 Найти цитируемый пост)
Флаг в руки, транспорант тебе на шею, только между тобой и мной есть очевидная разница

и хорошо  smile , не всем же быть такиме матерыми game-developer-ами.

ИМХО,
Современная разработка игр - это в первую очередь разработка контента, движок для каждой игры никто не пишет... 
А к движкам требования очень высокие, они как правило используются во множестве игр, они кросс-платформенные(PC и консоли), расширяемые и тд... и очень грамотно написаны... например unreal стоит 3 миллиона баксов, чуваки написавшие Irrlicht говорят что он нереально крут и стоит своих денег более чем, unreal 3 это не только графичесский движок, это еще и игровой движок, и АФАИК, целая среда разработки... от разработчиков игр требуется только создать контент  smile 

Автор: MAKCim 17.3.2008, 09:44
меня просто умиляет позиция "табу" на глобальные переменные  smile 
я уже который раз говорю на форуме, что стереотипы мешают
нельзя на вещи смотреть однобоко

Автор: vinter 17.3.2008, 10:29
Цитата(MAKCim @  17.3.2008,  10:44 Найти цитируемый пост)
меня просто умиляет позиция "табу" на глобальные переменные   я уже который раз говорю на форуме, что стереотипы мешаютнельзя на вещи смотреть однобоко

Максим но все же лучше использовать static члены класса\структуры чем глобальные переменные, принцип тот же, а ошибок можно получить в разы меньше..

Добавлено через 48 секунд
Цитата(Lazin @  17.3.2008,  10:31 Найти цитируемый пост)
ИМХО,Современная разработка игр - это в первую очередь разработка контента, движок для каждой игры никто не пишет... 

если это действительно новая разработка, претендующая на звание лучшей игры года, то скорее всего движок все же пишут.

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


Rickert, как я понял, ты утверждаешь, что игры (точнее движки) должны писаться хорошо? Тогда там точно глобальных переменных не будет smile
Цитата(Rickert @  15.3.2008,  11:51 Найти цитируемый пост)
 Глобальные переменные: системные установки, игровой мир, профиль игрока. 

Если они будут хоть немного друг от друга зависеть, то перечитай еще раз:
Цитата(archimed7592 @  16.3.2008,  02:46 Найти цитируемый пост)
Любой объект помимо своего глобального использования ещё имеет этапы инициализации и финализации, которые необходимо контролировать(как моменты свершения этих этапов, так и процесс их протекания). Без этого контроля глобальная переменная такая же полезная вещь, как, к примеру, неинициализированная локальная переменная.



ну и archimed7592, откуда такие познания про полотна неподдерживаемого кода?  smile 

Автор: Earnest 17.3.2008, 11:12
Глобальные переменные не имеют никаких преимуществ перед, например, синглетонами (которыми их следует по-возможности, заменять) кроме одного: их можно очень быстро добавить и использовать. Т.е. глобальные переменные - это способ сделать костыль, когда нужно быстро, а дизайн иного не позволяет. Но подлежат впоследствии редизайну.
Кстати, статические переменные класса в этом смысле ничуть не лучше - только имя другое, а суть та же.
ИМХО, статические переменные вполне хороши в локальном контесте (один - несколько модулей, связанных с реализацией какой-то функциональности); если речь идет о каких-то глобальных установках, которые нужны всем - лучше все собрать в кучку и выдавать по запросу - вместе или по отдельности, как удобнее. 
Это, кстати тоже вопрос инкапсюляции, как и открытый доступ с членам классов. Регламентированный доступ всегда лучше.

Цитата(Lazin @  17.3.2008,  10:31 Найти цитируемый пост)
Я однажды имел счастье доделывать программу, в которой было около 30 глобальных переменных, которые использовались в разных функциях, в итоге получалось так, что меняя что-нибудь в одном месте, ломалось в другом, разные части программы очень сильно друг от друга зависили...
О том что-бы что-то там распараллелить, расширить и тд не могло быть и речи.. короче просто переписал все))) теперь вспоминаю с содроганием...

Вот-вот, в эти  грабли никто не верит, пока сам не наступит.

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



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

Автор: Lazin 17.3.2008, 11:28
с глобальными переменными (и синглтонами) есть еще одни грабли... (наступал лично 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 , глобальные объекты должны быть глобальными, не важно что это - переменная константа или синглтон... просто чем таковых меньше тем проще...

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

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


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

Автор: bsa 17.3.2008, 11:57
SABROG, вся прелесть глобальных объектов в том, что неизвестно в какой последовательности они инициализируются.
Синглтоны призваны решить эту проблему. Подобные классы нужно инициализировать не глобально (у них же есть статический метод, доступный отовсюду), а в main() например, и в требуемой последовательности. Это позволяет вообще отказаться от глобальных переменных.

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

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

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


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

Код

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


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

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

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

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

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

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

Автор: Alek86 17.3.2008, 12:24
Цитата(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 
чето я не врублюсь - наверна выспаться нужно

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор: Lazin 17.3.2008, 13:11
Цитата(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 Найти цитируемый пост)
Я правда не знаю вызовется ли деструктор в этом случае

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

Автор: archimed7592 17.3.2008, 13:19
Цитата(Rickert @  17.3.2008,  04:47 Найти цитируемый пост)
archimed7592, я занимался разработкой игр, разговаривал и вёл интервью с несколькими реально разрабатывающими движки людьми. Так что можешь мне поверить.
Давай смотреть логично.

Хорошо, я тебе верю, давай, действительно, взглянём на логику smile.
Для начала - ты говоришь, что занимался разработкой игр... Давай определимся, каких игр? Каков был их бюджет? Окупились ли они? И т.д.
Ну а теперь о твоём основном аргументе: движок наше фсё! Отлично, возможно, движёк - это "нормальный"(в моём понимании), масштабируемый код. Ну и что? Давай проведём аналогию с областью прикладного ПО: для GUI-development есть такие "движки", как VCL, Qt, .NET WF и много других. Все они с некоторого ракурса - идеал того, как нужно "правильно проектировать и реализовывать".
Теперь возмём отдельный движок: VCL. Моя личная оценка этого движка: твердая четвёрка(по пятибальной шкале), т.е. движёк очень даже хороший. И теперь скажи мне: что мешает разработчику реализовывать бизнес-логику аккурат в обработчиках событий? А ведь реализовывают... И потом такие продукты даже продаются...
Теперь вернёмся обратно к КИ - по аналогии, каким бы ни был хорошим движок, саму игру можно реализовать в любом стиле. Почему реализовывают именно в плохом стиле я писал в предыдущих постах.
Т.е., другими словами, движок - это лишь малая часть игры и это не аргумент в пользу качества кода самих игр.

Цитата(Rickert @  17.3.2008,  08:57 Найти цитируемый пост)
Программисты стали настолько слабы, что не могу контролировать процесс изменения переменных? Твои слова актуальны для крупных команд разработчиков.

Да дело не только в изменении переменных, опять же, прочитай мои предудущие посты.
Кстати, а что, КИ разрабатывают команды из 1-2 разработчиков?

Цитата(MAKCim @  17.3.2008,  09:44 Найти цитируемый пост)
меня просто умиляет позиция "табу" на глобальные переменные  smile 
я уже который раз говорю на форуме, что стереотипы мешают
нельзя на вещи смотреть однобоко 

А нет никакого табу. http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.15, http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.16

Цитата(Alek86 @  17.3.2008,  10:44 Найти цитируемый пост)
ну и archimed7592, откуда такие познания про полотна неподдерживаемого кода?  smile 

Логические умозаключения основанные на общение с несколькими разработчиками КИ, чтении форумов, посвящённых КИ и т.д.

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

Приватный статик = глобальная переменная с ограниченой видимостью, но, затем расширенной видимостью до глобальной.
Т.о. не хуже, но и не лучше.

Автор: Alek86 17.3.2008, 13:30
про удаления как-то не задымывался - надо почитать...

Цитата(archimed7592 @  17.3.2008,  13:19 Найти цитируемый пост)
Т.о. не хуже, но и не лучше.

лучше хотя бы тем, что легче отследить изменения в отладке.

Автор: MAKCim 17.3.2008, 13:40
Цитата(Alek86 @  17.3.2008,  12:36 Найти цитируемый пост)
а я говорю с позиции нормального компилятора, который мелкие функции (делегирование и т.п.) инлайнит

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

Автор: Alek86 17.3.2008, 13:49
Цитата(MAKCim @  17.3.2008,  13:40 Найти цитируемый пост)
даже явный inline может не заставить компилятор заинлайнить функциюо чем можно здесь говорить?

можешь привести пример. когда компилер может незаинлайнить функцию доступа?
Код

struct S {
 static int& I() {return i;}
private:
 static int i;
};

Автор: bsa 17.3.2008, 13:56
Alek86
отключи оптимизацию и она не будет заинлайнена  smile 

Автор: MAKCim 17.3.2008, 14:36
Цитата(Alek86 @  17.3.2008,  13:49 Найти цитируемый пост)
можешь привести пример. когда компилер может незаинлайнить функцию доступа?

пожалуйста
Код

struct S {
     static int& I() {return i;}
    private:
      static int i;
};

int main() {
    return S :: I() = 2;
}

Код

.globl main
    .type   main, @function
main:
.LFB3:
    pushq   %rbp
.LCFI2:
    movq    %rsp, %rbp
.LCFI3:
    call    _ZN1S1IEv /* вызов нашего метода */
    movl    $2, (%rax)
    movl    (%rax), %eax
    leave
    ret

это GCC 4.1.2 без оптимизации

Автор: Alek86 17.3.2008, 14:53
за что платишь, то и получаешь...

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

Автор: MAKCim 17.3.2008, 15:02
Alek86
понимаешь в чем тут дело
оптимизация - это дело хорошее, но она нигде не специфицирована
даже на уровне отдельно взятого компилятора
да, есть некоторые общие правила, которые позволяют включать/выключать определенного рода оптимизации, но не более того
мы не можем полагаться на то, что не специфицировано, в том числе на инлайнинг 

Автор: JackYF 17.3.2008, 17:00
Цитата(MAKCim @  17.3.2008,  14:02 Найти цитируемый пост)
мы не можем полагаться на то, что не специфицировано, в том числе на инлайнинг  

ну, я тоже не могу полагаться на то, что завтра на меня не упадёт метеорит smile

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

Автор: MAKCim 17.3.2008, 17:37
Цитата(JackYF @  17.3.2008,  17:00 Найти цитируемый пост)
ну, я тоже не могу полагаться на то, что завтра на меня не упадёт метеорит

не верно
я тебе даю 100% гарантию, что завтра на тебя метеорит не упадет  smile 
Цитата(JackYF @  17.3.2008,  17:00 Найти цитируемый пост)
Основное правило у меня такое: глобальные переменные используются только при необходимости, в основном, когда их использование существенно влияет на скорость исполнения ключевых элементов программы. Но примеров таких мало. 

угумс  smile 
насчет примеров, посмотри код ядра Linux
там глобальных переменных очень много
это хоть и С, но все же

Автор: Alek86 17.3.2008, 17:40
Цитата(MAKCim @  17.3.2008,  17:37 Найти цитируемый пост)
я тебе даю 100% гарантию, что завтра на тебя метеорит не упадет

хоть ни в каком стандарте этого и не написано, да?
(кстати, скорее 99,999999%-ю гарантию)

Цитата(MAKCim @  17.3.2008,  17:37 Найти цитируемый пост)
посмотри код ядра Linux

както кощунственно, имхо, ориентироваться на человека (Торвальдса) который почем зря материт (в прямом смысле этого слова) C++ smile
кстати, интересно, он в памяти хранит все взаимосвязи и места изменения глобальных переменных в ядре? или на бумажке рядом?

Автор: MAKCim 17.3.2008, 18:00
Цитата(Alek86 @  17.3.2008,  17:40 Найти цитируемый пост)
хоть ни в каком стандарте этого и не написано, да?

почему не написано?
метеорит ниоткуда появится не может, правильно?
если бы была потенциальная опасность для Земли, это было бы всем известно
причем известно не за один день до столкновения  smile 
отсюда вывод: гарантия 100%
Цитата(Alek86 @  17.3.2008,  17:40 Найти цитируемый пост)
както кощунственно, имхо, ориентироваться на человека (Торвальдса) который почем зря материт (в прямом смысле этого слова) C++

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

зачем что-то хранить?
тут принцип простой
либо данные полностью безопасны в плане доступа к ним (например per-cpu или атомарные данные), либо они защищены семафором/мьютексом/rw-блокировкой/...

Автор: SABROG 17.3.2008, 18:11
Кстати тоже хочу ссылку, где Линус материт C++. Интересно какой бы язык программирования он тогда выбрал.

Жители Припяти тоже давали 100% гарантию, что завтра они никуда не собираются уезжать, но ЧАЭС распорядилась http://www.bellona.ru/imagearchive/PICT0482.JPG.

Автор: MAKCim 17.3.2008, 18:16
Цитата(SABROG @  17.3.2008,  18:11 Найти цитируемый пост)
Жители Припяти тоже давали 100% гарантию, что завтра они никуда не собираются уезжать, но ЧАЭС распорядилась по-другому.

не надо сравнивать падение метеорита и аварию на АЭС
метеорит в отличие от аварии асинхронно упасть не может  smile 

Автор: bsa 17.3.2008, 18:18
MAKCim, метеориты бывают разных размеров. Причем, далеко не все, долетающие до земли, могут быть зафиксированы заранее.

Автор: Alek86 17.3.2008, 18:23
не помню, честно говоря, где именно с "плохими словами"
для начала можно поискать в гугле по строке: "C++ is a horrible language"

Автор: SABROG 17.3.2008, 18:23
Цитата(bsa @ 17.3.2008,  18:18)
MAKCim, метеориты бывают разных размеров. Причем, далеко не все, долетающие до земли, могут быть зафиксированы заранее.

Пора статью писать на тему "Что общего между C++ и метеоритами"  smile 

Вот, что Лайнус пишет, если кто переведет смысл буду благодарен:

Цитата

From: Linus Torvalds <torvalds <at> linux-foundation.org>
Subject: Re: [RFC] Convert builin-mailinfo.c to use The Better String Library.
Newsgroups: gmane.comp.version-control.git
Date: 2007-09-06 17:50:28 GMT (27 weeks, 3 days, 21 hours and 34 minutes ago)

On Wed, 5 Sep 2007, Dmitry Kakurin wrote:

> When I first looked at Git source code two things struck me as odd:
> 1. Pure C as opposed to C++. No idea why. Please don't talk about portability,
> it's BS.

*YOU* are full of bullshit.

C++ is a horrible language. It's made more horrible by the fact that a lot 
of substandard programmers use it, to the point where it's much much 
easier to generate total and utter crap with it. Quite frankly, even if 
the choice of C were to do *nothing* but keep the C++ programmers out, 
that in itself would be a huge reason to use C.

In other words: the choice of C is the only sane choice. I know Miles 
Bader jokingly said "to piss you off", but it's actually true. I've come 
to the conclusion that any programmer that would prefer the project to be 
in C++ over C is likely a programmer that I really *would* prefer to piss 
off, so that he doesn't come and screw up any project I'm involved with.

C++ leads to really really bad design choices. You invariably start using 
the "nice" library features of the language like STL and Boost and other 
total and utter crap, that may "help" you program, but causes:

 - infinite amounts of pain when they don't work (and anybody who tells me 
   that STL and especially Boost are stable and portable is just so full 
   of BS that it's not even funny)

 - inefficient abstracted programming models where two years down the road 
   you notice that some abstraction wasn't very efficient, but now all 
   your code depends on all the nice object models around it, and you 
   cannot fix it without rewriting your app.

In other words, the only way to do good, efficient, and system-level and 
portable C++ ends up to limit yourself to all the things that are 
basically available in C. And limiting your project to C means that people 
don't screw that up, and also means that you get a lot of programmers that 
do actually understand low-level issues and don't screw things up with any 
idiotic "object model" crap.

So I'm sorry, but for something like git, where efficiency was a primary 
objective, the "advantages" of C++ is just a huge mistake. The fact that 
we also piss off people who cannot see that is just a big additional 
advantage.

If you want a VCS that is written in C++, go play with Monotone. Really. 
They use a "real database". They use "nice object-oriented libraries". 
They use "nice C++ abstractions". And quite frankly, as a result of all 
these design decisions that sound so appealing to some CS people, the end 
result is a horrible and unmaintainable mess.

But I'm sure you'd like it more than git.

    Linus



Ицточнег: http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918

git - программа контроля версий типа cvs и subversion
VCS - version control service/server

Я так понял git написан на чистом Си, а C++ ему не нравится из-за навороченности с ООП и еще речь о каких-то крашах непонятных, говорит хотите систему контроля версий написанную на C++ со всякими stl, boost'aми и т.д. юзайте monotone (еще одна cvs).

Грубо говоря ассемблер это наше всё  smile 

Цитата

It has nothing to do with dinosaurs. Good taste doesn't go out of style, 
and comparing C to assembler just shows that you don't have a friggin idea 
about what you're talking about.


Упс  smile 

И Jav'e досталось  smile 
Цитата

And if you want a fancier language, C++ is absolutely the worst one to 
choose. If you want real high-level, pick one that has true high-level 
features like garbage collection or a good system integration, rather than 
something that lacks both the sparseness and straightforwardness of C, 
*and* doesn't even have the high-level bindings to important concepts. 

IOW, C++ is in that inconvenient spot where it doesn't help make things 
simple enough to be truly usable for prototyping or simple GUI 
programming, and yet isn't the lean system programming language that C is 
that actively encourags you to use simple and direct constructs.

    Linus

Автор: archimed7592 17.3.2008, 19:00
SABROG, он пишет, почему он выбрал именно Си для реализации Git(IIRC, дело было в 2005).
Переведу только одно предложение, наиболее резко и лаконично показывающее отношение Линуса к С++
Цитата(SABROG @  17.3.2008,  18:23 Найти цитируемый пост)
Quite frankly, even if 
the choice of C were to do *nothing* but keep the C++ programmers out, 
that in itself would be a huge reason to use C.


Цитата
Откровенно говоря, даже если бы выбор Си [как языка реализации Git] был бы обусловлен только тем, чтобы проучить С++ программистов, то это само по себе было бы очень веское основание выбрать именно Си.



Автор: MAKCim 17.3.2008, 19:04
забавно  smile 

Автор: Earnest 17.3.2008, 19:45
MAKCim, возвращаясь к глобальным переменным и производительности. 
Конечно, трудно спорить, что компилятор может, но не обязан встроить обращение к глобальной переменной через функцию, и если он этого не сделает, то обращение через функцию медленнее. Но, на практике, когда это критично? Если есть какой-то критичный кусок кода, изобилующий обращениями к какому-то синглетону (в цикле, например), что, религия запрещает скопировать ссылку в авто-переменную? А в остальных случаях разница нечувствительна.

Автор: JackYF 17.3.2008, 20:20
Цитата(MAKCim @  17.3.2008,  16:37 Найти цитируемый пост)
я тебе даю 100% гарантию, что завтра на тебя метеорит не упадет

Ты не можешь мне дать 100%-ную гарантию ничего-либо, что ещё не произошло smile Ну физические не можешь - ты не можешь учесть _все_ обстоятельства - мы всего лишь люди, а не боги smile

Цитата(MAKCim @  17.3.2008,  17:00 Найти цитируемый пост)
если бы была потенциальная опасность для Земли, это было бы всем известно
причем известно не за один день до столкновения  smile 
отсюда вывод: гарантия 100%

Первый вывод неверен. Ты хочешь сказать, что вероятность неинформирования тебя об этом равна нулю? smile

Автор: vinter 17.3.2008, 21:13
кстати кто что думает об интервенции китайцев на Дальнем Востоке?

Автор: MAKCim 17.3.2008, 22:06
Цитата(Earnest @  17.3.2008,  19:45 Найти цитируемый пост)
что, религия запрещает скопировать ссылку в авто-переменную?

что делать в случае если он (объект, инкапсулированный в синглетон) будет уничтожен и локальная ссылка станет невалидной?  smile

Добавлено через 1 минуту и 6 секунд
Цитата(JackYF @  17.3.2008,  20:20 Найти цитируемый пост)
Ты хочешь сказать, что вероятность неинформирования тебя об этом равна нулю?

думаю, да  smile

Добавлено через 2 минуты и 7 секунд

M
MAKCim
Все, с оффтопом заканчиваем

Автор: Mayk 18.3.2008, 07:59
синглтоны тоже не люблю. Люблю обратную инициализацию. Или как там этот паттерн называется:
Вместо
Код

Foo::bar(){
    Logger::instance().write("i am a bar!");
}
...
main(){
    Foo foo;
    foo.bar()
}

делать
Код

Foo::setLogger(Logger* l){
    loggerInstance  = l;
}
Foo::bar(){
    if( loggerInstance )
       loggerInstance->write( "i am a bar!" );
}
...
main(){
    Foo foo;
    Logger l(std::cout)
    foo.setLogger( &l )
    foo.bar()



Цитата(Rickert @  17.3.2008,  12:57 Найти цитируемый пост)
Программисты стали настолько слабы, что не могу контролировать процесс изменения переменных? Твои слова актуальны для крупных команд разработчиков.

Программисты настолько слабы что не могут держать в памяти всё и вся. Если программа начинает не вмешацца на экран --- ОЙ.


Автор: Earnest 18.3.2008, 11:04
Цитата(MAKCim @  17.3.2008,  23:06 Найти цитируемый пост)
что делать в случае если он (объект, инкапсулированный в синглетон) будет уничтожен и локальная ссылка станет невалидной

Решать проблемы по мере поступления. Использование глобальной переменной здесь тоже не поможет. Если объект может исчезнуть, когда ему приспичит, нужно принимать адекватные меры - ссылки считать, например.

Добавлено через 2 минуты и 44 секунды
Mayk, дык твой вариант подлиннее получается - за шо ж его любить? smile 
Синглетоны, конечно, не панацея от всего, как и все остальное, впрочем. Каждому сверчку - по шестку.

Автор: MAKCim 18.3.2008, 12:08
Цитата(Earnest @  18.3.2008,  11:04 Найти цитируемый пост)
Использование глобальной переменной здесь тоже не поможет. Если объект может исчезнуть, когда ему приспичит, нужно принимать адекватные меры - ссылки считать, например.

вот пример
Код

SomeClass * variable; // global definition
...
for (...) {
    if (!variable)
        break;
    // work with variable
    // some actions
}
...

в some actions может идти, например, вызов функций, одна из которых удаляет variable (или реинициализирует (delete + new), или еще что-нибудь в этом роде)
программа однопоточная

Автор: SABROG 18.3.2008, 12:30
Цитата(Mayk @  18.3.2008,  07:59 Найти цитируемый пост)
    Foo foo;
    foo.bar()


Если возвращаться к теме об интервенции китайцев на дальнем востоке, то ради любопытства хотелось бы узнать как переводится слова "foo", "bar" и "foobar", гугл транслейт отжигает: "фоо", "бар".

Автор: MAKCim 18.3.2008, 23:15
SABROG
http://en.wikipedia.org/wiki/Foo

Автор: SABROG 18.3.2008, 23:45
Цитата(MAKCim @ 18.3.2008,  23:15)
SABROG
http://en.wikipedia.org/wiki/Foo

Спс, жалко там так и не написали "откуда есть пошла русская земля". А вообще странное у американцев понятие слова "хакер", для них это каста программистов фанатиков, а не отряд бойцов дельфистов выпущенных МГУ. У нас же это человек обязательно нарушающий статьи 272, 273

Автор: bsa 19.3.2008, 00:27
Цитата(SABROG @ 18.3.2008,  23:45)
А вообще странное у американцев понятие слова "хакер", для них это каста программистов фанатиков, а не отряд бойцов дельфистов выпущенных МГУ. У нас же это человек обязательно нарушающий статьи 272, 273

http://ru.wikipedia.org/wiki/Хакер

Это не у американцев странное, а у нас благодаря серости журналистов. Помню еще батя говорил мне года эдак 20-22 назад, что мечтает, чтобы я стал хакером (потому что это "высшая каста")... И об уголовщине речи вообще не шло (мне было лет 5-7).

Автор: archimed7592 19.3.2008, 15:19
Об чём угодно(и метеориты и вероятностная модель и foobar и хакеры), только не о глобальных переменных smile 

Автор: MAKCim 19.3.2008, 18:03
archimed7592
все
теперь любой оффтоп будет караться  smile (на комодераторов и модераторов это тоже распространяется)

Автор: nerezus 9.4.2008, 06:46
Цитата

оптимизация - это дело хорошее, но она нигде не специфицирована
даже на уровне отдельно взятого компилятора
 Какая разница? Смысл в том, что она работает, причем работает успешно.
Причем работает сама(без вмешательства пользователя).
Т.е. ни за что мы получаем ОЖИДАЕМУЮ оптимизацию.

Цитата

Число Пи лучше сделать глобальной константой...
 Число пи лучше сделать статической константой математического модуля. По крайней мере я видел всегда именно такое.


Цитата

archimed7592, разработка игр. Глобальные переменные: системные установки, игровой мир, профиль игрока. Теже системные установки необходимы для инициализации окна и обработки событий.
 Посмотри движки. Насколько я видел их, сделано оно там синглтонами или агрегацией.

P.S. Не вижу абсолютно никакого смысла в глобальных переменных. Ибо ООП.
Однако не вижу ничего плохого в их использовании(использую сам в движке своем, не завожу класс конфига, к примеру)

Автор: UnrealMan 9.4.2008, 11:29
Цитата(nerezus @  9.4.2008,  06:46 Найти цитируемый пост)
Число пи лучше сделать статической константой математического модуля. 

Поясни, что подразумевается под "статической константой математического модуля".

Автор: bsa 14.4.2008, 21:25
Цитата(UnrealMan @ 9.4.2008,  11:29)
Цитата(nerezus @  9.4.2008,  06:46 Найти цитируемый пост)
Число пи лучше сделать статической константой математического модуля. 

Поясни, что подразумевается под "статической константой математического модуля".

Код
static const double Pi = 3.14;

Автор: UnrealMan 15.4.2008, 00:51
Цитата(bsa @ 14.4.2008,  21:25)
Цитата(UnrealMan @ 9.4.2008,  11:29)
Цитата(nerezus @  9.4.2008,  06:46 Найти цитируемый пост)
Число пи лучше сделать статической константой математического модуля. 

Поясни, что подразумевается под "статической константой математического модуля".

Код
static const double Pi = 3.14;

Что это - глобальная статическая константа?

Автор: archimed7592 15.4.2008, 03:40
А зачем её быть статической? Она что, только в мат. модуле используется? smile

Автор: bsa 15.4.2008, 23:24
Цитата(archimed7592 @ 15.4.2008,  03:40)
А зачем её быть статической? Она что, только в мат. модуле используется? smile

Думаю, чтобы заставить компилятор соптимизировать код  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)