Другие языки программирования и технологии

[C++] Почему не рекомендуют использовать глобальные переменные?

Помню на лекциях препод говорил что глобальные переменные использовать не рекомендуется. Вроде как доступ к ним осуществляется дольше. Но я не понимаю, чем обращение к памяти в стеке быстрей или лучше чем к глобальной? И если использовать static переменные, получается они равно такие же глобальные, только формально компилятор прячет их имена от меня вне области? Так и не понял, чем глобальные переменные плохи.
1. Непрослеживаемость изменений. Ты не можешь знать, не изменит ли какая-то функция глобальную переменную, и будешь использовать эту переменную после из расчета, что она не изменена.
2. Чтобы узнать где глобальная переменная меняется, тебе надо просмотреть практически всю программу.
3. Ты можешь запутаться в именах, если их очень много
4. Иногда они бывают к месту, но очень редко.
Павел Аксенов
Павел Аксенов
39 077
Лучший ответ
Это относится только к очень большим проектам. Если обращение к переменной происходит из другого сегмента памяти, то мы уже упираемся в недостатки архитектуры х-80-х процессоров.
В main() можно использовать любые переменные. Но функция должна работать только с тем, что ей дают, иначе это не функция в полном смысле этого слова.
Гугли отличие стека от кучи (глобальные переменные хранятся в куче, локальные - в стеке), да и в общем, как работает память
ГФ
Гарри Фриц
23 106
Добавлю своих пять копеек. Думаю что стек находится в кеше (локальные переменные делаются в стеке), глобальная создается в куче, и если она давно не используется то наверняка ее нет уже в кеше.
Humphrey Simpson
Humphrey Simpson
15 408
Павел Аксенов Глобальные переменные находятся а секции .data
Проблема с глобальными переменными в том, что любой метод может менять их значения. Если у вас код на 5000 строк, в котором 30 методов / функций контролировать значение переменной становится очень трудным. В каком-нибудь методе взял и случайно изменил значение, а в другом методе, ты думал, что значение одно, а оно на самом деле другое, и ищешь полдня в каком месте программы поменялось значение.
00
0 0
8 600
Чтобы не засирать память, если у Вас мощная прога с тяжёлыми вычислениями