Step 2 (S-11066)
Step on Stepik: https://stepik.org/lesson/560/step/2
[00:00 - 00:15] в данном сегменте мы обсудим ключевые слова статик однако начнем с обсуждения глобальных перемен глобальной переменной это переменные которые определяются вне функции доступ к таким глобальным переменным можно получить из любой точки программ
[00:15 - 00:33] то есть в любой части программа может написать код который работает с глобальными переменными для того чтобы объявить глобальную переменную нужно указать ключевое слово экстра который указывает что это именно объявления тип имя глобальной переменной в данном случае
[00:33 - 00:47] объявляется глобальная переменная типа int с именем global наличие объявление глобальной переменной позволяет писать код который работает глобально то есть можно написать функцию
[00:47 - 01:02] и которой даны глобальная переменная инкрементируется при каждом вызове функции глобальная переменная будет увеличивать свое значение в единицах для того чтобы написать определение глобальной переменной нужно просто указать
[01:02 - 01:20] имя и инициализирую иначе представьте как это происходит для локальных переменных с 1 лишь разницей что локальной переменной определяются внутри функции а глобальные если опустить интервьюирующие выражения то
[01:20 - 01:37] данная переменная будет приносить равно 0 отличие от локальных переменных для которых это не гарантируется то есть значение локальных переменных которые нет интересующего значение неопределенного до глобальных переменных такая гарантия есть однако не стоит этим пользоваться
[01:37 - 01:53] соображения хорошо стиле разумно всегда не отреагирует глобальные перемены даже если хотите проецировать технарем просто можно указать что равно 0 в этом случае всем кто читает ваш код будет понятно что там непременно
[01:53 - 02:11] изначально время жизни глобальные перемены начинаются при запуске программы происходит нейтрализация всех глобальных переменных и заканчивается при выходе из программы ну когда уже никакие перемены не существует
[02:11 - 02:26] объявление и определение глобальных переменных работает так же как работает объявление и определение функций то есть может быть много объявлений но должна быть только 1 определение
[02:26 - 02:42] определение должно быть в какой то визитница трансляции и тогда в этой единице трансляция будет выделено место под хранение этой глобальной переменной если так окажется что ваша программа есть несколько определений 1 и тоже глобальной переменной то на этапе линковки произойдет ошибка
[02:42 - 02:59] то есть у вас есть несколько единиц трансляции и которой уделяют глобальных переменных и непонятно какой из них поэтому объявление глобальных переменных разумно хранить в заголовочных файлах то есть
[02:59 - 03:15] можно прямо переместить заголовочный файл и подключать а определения глобальных переменных должно быть в файлах сходу 8 пифах многие наверное из вас слышали что глобальные переменные это зло
[03:15 - 03:33] действительно о глобальных переменах существует достаточно много проблем давайте перечислим основные из них 1 такая проблема это проблемы с масштабируемостью если ваша программа завязана на
[03:33 - 03:48] глобальная переменная только достаточно сложно масштабировать например пусть вас есть некоторых библиотеках которая реализует базу данных это библиотека использует глобальные перемены теперь если вы захотите использовать для независимой базы данных вашей программе
[03:48 - 04:07] то вам придется бороться с тем что эти 2 баз данных они будут работать с 1 и той же глобальной переменной таким образом будет происходить в колизее наличие глобальных переменных оно мешает масштабировать включать 1 программу в другую
[04:07 - 04:26] она личные проблемы возникнут в этом случае если вы хотите сделать ваше приложение многопоточный любое обращение глобальную переменную придется окружать секретирующими примите для того чтобы не получилось так что разные потоки одновременно обращаются к 1 глобальной
[04:26 - 04:45] 2 проблема это побочные эффекты наличие глобальных переменных позволяет писать функция которая имеет побочный эффект и значение которых результат которых зависит от того какую сейчас значение глобальных перемен то есть в принципе обычно
[04:45 - 05:04] математическом понятие функции она всегда 1 и тоже значение при 1 и том же наборе аргументы то есть если мы передадим функцию квадратного корня значение 2 то она всегда будет подавать в качестве результата корень из 2
[05:04 - 05:20] однако наличие глобальных переменных позволяет писать функции значение которых может быть различны несмотря на то что мы в них всегда передом 1 1 и тот же набор аргументов с таким функционалом очень сложно следить
[05:20 - 05:38] и сложно контролировать кто и когда изменяет эти глобальные переменные дело в том что любой код может иметь глобальную переменную если бы код любой момент может не только прочитать эту глобальную переменную посмотреть какое значение но изменить а это может повлиять на
[05:38 - 05:55] весь код который с этой целью он работает и 3 проблема тоже довольно серьезно докучаева в следующем стандарт нет специфицирует в каком порядке глобальной переменной будут инициализироваться
[05:55 - 06:11] то есть внутри 1 единице трансляции действительно глобальные перемены будут интегрироваться в порядке определения то есть сверху вниз если у вас есть несколько глобальных переменных в разных единицах трансляции то порядок инициализации и кем не определен
[06:11 - 06:28] например можно предположить что где то в другую единицу трансляции другом файле есть некоторые глобальной переменной int же большое равняется 50
[06:28 - 06:45] это глобальная переменная объявленная где то не функции и можно изменить инициализацию наша глобальной переменной global так чтобы она интегрировалась например значением 10 + значение переменной ж
[06:45 - 07:02] в зависимости от того в каком порядке будут инициализироваться эти глобальные перемены в 1 случае проинициализировать переменную global значением 60 а в другом случае проинициализирован примерно global некоторым непонятным значение
[07:02 - 07:21] если так получится что сначала будет интерпретировать непременно global потом переменной же то мы проанализируем переменной global значением 10 + некоторое значение инициализированы то есть но значение ячейки памяти до того момента как она прошла инициализацию
[07:21 - 07:39] таким образом получим неопределенное поведение программы и главное чтоб вечером плохо предсказуемым они могут зависеть от того как компилятор при последней компиляции расположил глобальная переменная в секции инициализации
[07:39 - 07:57] то есть как то повлиять на это очень сложно есть и некоторые другие проблемы с можно поставить здесь многоточие в общем случае конечно использование глобальных переменных стоит избегать наличия
[07:57 - 08:17] или необходимость наличия глобальных переменных вашей программе означает что у вас есть некоторые проблемы с дизайном в общем случае глобальных переменных программе быть не должно ну или почти не должна и если уж вы какие то глобальные перемены добавляете то это должно быть какие то вспомогательные вещи которых
[08:17 - 08:35] ничего не зависит и что всегда было понятно где кто когда и какой код конкретно обращаются к этим переменам когда изменяет код должен быть немного поточней ну тогда то есть чтобы избегать всех этих сложных проблем сложных
[08:35 - 08:42] и сложных решений которые необходимы для решения этих проблем следует избегать глобальных переменных