Войти
ПрограммированиеФорумОбщее

Глобальные переменные в С++

Страницы: 1 2 3 4 5 6 7 Следующая »
#0
10:15, 14 янв. 2021

Интересует, желательно (или или наоборот, нежелательно ли) использование глобальных переменных в С++ именно в геймдеве?

Не в плане удобства, а в плане скорости выполнение программы, глючности/безглючности, наличия каких-нибудь специфических особенностей глобальных переменных влияющих на ошибки памяти?

Или в этих отношениях нет разницы между локальными и глобальными переменными?


#1
(Правка: 10:33) 10:32, 14 янв. 2021

Могут быть лёгкие просадки из-за забавной особенности - глобальные переменные чтобы адресовать надо прописать их полный адрес в инструкции. А если они находятся в DLL-ке, то там вроде еще хуже.
Но у x86 работа со стеком в относительных смещениях может использовать всего лишь байтовые смещения.
https://gcc.godbolt.org/z/9xox5d
Обрати внимание, что ф-я g() имеет размер 4 байта, а ф-я f() уже 9 байт. Это вот пенальти на полный адрес до глобальной переменной.
P.S.
Блин, он там параметр вообще в регистры затусовал, но если будет локальная переменная будет 5 байт из-за байтового смещения и всего лишь.

#2
12:52, 14 янв. 2021

=A=L=X=
> глобальные переменные чтобы адресовать надо прописать их полный адрес в
> инструкции.
там же кстати и static\thread_local переменная окажется.

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

#3
13:37, 14 янв. 2021

Глобальные переменные (не важно, это синглтон, вытаскиваемый из функции или просто глобальная переменная) - это зло, но которое часто бывает вынужденным. Основная причина - это необходимость доступа к неким данным из любого места программы. В принципе, это косяк архитектуры, но в реальной жизни много проще сделать что-то глобальным, чем мастерить идеальное дерево зависимостей и механизм доступа к любому сервису программы из нужных мест.
Например, есть у тебя класс - хендл на ресурс. Ты просто вызываешь ему get() и он тебе грузит ресурс (если не загружен) и возвращает тебе указатель. Но если менеджер ресурсов не глобальный, то его нужно будет протаскивать в этот get() или делать get(ResHandle) функцией-членом этого самого менеджера. А это все многословно.
И, да, глобальные переменные очень опасны в многопоточном приложении. Если ты изначально пишешь что-то TruЪ-многопоточное, то избегай их как можешь или готовься пхать примитивы синхронизации в каждый чих.

#4
14:10, 14 янв. 2021

Если честно, вопрос сам по себе странный.. Не мыслю себе код серьёзного проекта без глобальных переменных..

#5
(Правка: 14:32) 14:30, 14 янв. 2021

DEN 3D
> Если честно, вопрос сам по себе странный.. Не мыслю себе код серьёзного проекта
> без глобальных переменных..
С помощью указателей можно легко и без глобальных переменных обходится, что я до этого момента и делал. Просто у меня есть выбор из-за структуры моего кода (посмотрев на который половина местных форумчан разбила бы себе лицо фейспалмом, а вторая половина объявила бы награду за мою голову) использовать или не использовать глобальные переменные. Вот и спросил.

#6
(Правка: 14:53) 14:37, 14 янв. 2021

=A=L=X=
> А если они находятся в DLL-ке
которых нет под консолями

kipar
> А так у глобальных основная проблема в том что если их менять из разных мест
не меняй

Went
>Глобальные переменные - это зло

не большее зло чем if и case
прикольно жить наверное по методичке

#7
16:15, 14 янв. 2021

forwhile
> не меняй
в смысле не меняй? А если мне надо?

#8
16:22, 14 янв. 2021

kipar
> в смысле не меняй? А если мне надо?
тогда меняй, в чем проблема

#9
17:43, 14 янв. 2021

Went
> готовься пхать примитивы синхронизации в каждый чих.

Все разделяемые ресурсы должны быть синхронизированы. В "каждом чихе", так или иначе.

forwhile
> kipar
> > в смысле не меняй? А если мне надо?
> тогда меняй, в чем проблема

Lol.

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

Went
> Глобальные переменные ... это зло

#10
18:47, 14 янв. 2021

forwhile
> прикольно жить наверное по методичке
Главное как можно быстрее перейти на личности, да?

#11
19:13, 14 янв. 2021

rcsim
> Все разделяемые ресурсы должны быть синхронизированы. В "каждом чихе", так или
> иначе.
Ключевое слово "разделяемые". Если я не использую глобальные переменные, то я точно знаю, что я отправляю на обработку в отдельный поток. Может быть дешевле сделать копию какого-то объекта, который был бы глобальным, чем делать мьютексы в каждой его функции, потому что раз в сто лет мы можем иметь одновременный доступ.

> Проблема тут всё таки в том, что у кодеров появилась много всякой
> высокоуровневой халявы,
> и у многих возникает мнение, что за кодом теперь можно не следить, достаточно
> поклоняться паттернам,
> вот в стиле такого каргокульта:
И снова переход на личности... Да нет у меня никакого карго-культа. У меня в коде дофига глобальных переменных и синглтонов. Потому что мне нужен быстрый результат а не идеальная академическая программа. А если говорить про абстрактный идеал, то, да - таки, зло.

#12
22:51, 14 янв. 2021

Went
> Если я не использую глобальные переменные, то я точно знаю, что

Я тоже точно знаю что я делаю, причём независимо от использования глобальных имён.
Ведь это я пишу свой код. Он мой. При его создании не бухаю, домовых не держу.
Комментирую и документирую, по мере надобности, даже если соло.

Went
> А если говорить про абстрактный идеал, то, да - таки, зло.
Это и есть культ (даже слово "зло" говорящее).

Нет никаких абстрактных идеалов. Есть ситуации когда нужен молоток и когда отвертка.
Как выше написали: нужно - пиши, не нужно - не пиши.

Глобальные имена (в разных проявлениях) - это обычный рутинный подход,
просто он требует понимания ответственности и соблюдения правил.

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

#13
9:36, 15 янв. 2021

MikeNew
> Интересует, желательно (или или наоборот, нежелательно ли) использование
> глобальных переменных в С++ именно в геймдеве?

смотри UE4

#14
10:00, 15 янв. 2021

"Настоящий программист не боится использовать goto".

Соблюдение строгих правил полезно тому, кто этих правил не понимает и не способен пока сам технологии вырабатывать. Однако, кто ж такого заставит...
Обученному правила не нужны, а необученный не видит в них необходимости.

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумОбщее