Перейти к содержимому


Фотография

Локальные переменные не работают

Lua

Лучший Ответ eu_tomat , 23 Ноябрь 2017 - 01:13

Услышал от qwertyMan'а что глобальные переменные зло и решил заменить все глобальные в приложении на локальные и перестало работать.

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

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 Оффлайн   FelixBanan

FelixBanan
  • Пользователи
  • Сообщений: 46
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

           

Отправлено 22 Ноябрь 2017 - 22:02

Услышал от qwertyMan'а что глобальные переменные зло и решил заменить все глобальные в приложении на локальные и перестало работать. Может я очень тупой и что то не правильно сделал но не работает.


Сообщение отредактировал Alex: 22 Ноябрь 2017 - 22:32
много грязи и мата


#2 Оффлайн   Deadlyy

Deadlyy
  • Пользователи
  • Сообщений: 4
  • Уровень сигнала: 29,63%
  • В игре: 181 час. 36 мин.

Отправлено 22 Ноябрь 2017 - 23:04

Ну смотри. Глобальные переменные действуют НА ВСЮ программу... а локальные - на цикл и т.п.

Возможно что у тебя ниже кто-то просится к локальной переменной которую не может получить.

*Возможно я ничего не знаю про переменные в Lua. Поправьте кто нибудь. :(*



#3 Оффлайн   FelixBanan

FelixBanan
  • Автор темы
  • Пользователи
  • Сообщений: 46
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

           

Отправлено 22 Ноябрь 2017 - 23:05

Ну смотри. Глобальные переменные действуют НА ВСЮ программу... а локальные - на цикл и т.п.
Возможно что у тебя ниже кто-то просится к локальной переменной которую не может получить.
*Возможно я ничего не знаю про переменные в Lua. Поправьте кто нибудь. :(*

как я знаю глобальные записываются в оперативную память, а локальные работают только по программе. А тут это не работает.

#4 Оффлайн   Deadlyy

Deadlyy
  • Пользователи
  • Сообщений: 4
  • Уровень сигнала: 29,63%
  • В игре: 181 час. 36 мин.

Отправлено 22 Ноябрь 2017 - 23:34

как я знаю глобальные записываются в оперативную память, а локальные работают только по программе. А тут это не работает.

Окей. Мне всегда хватало ОЗУ. Я не думаю что глобальные переменные будут жрать  сотни кб памяти.



#5 Оффлайн   ivan52945

ivan52945
  • Пользователи
  • Сообщений: 129
  • Уровень сигнала: 62,7%
  • В игре: 384 час. 21 мин.

Награды

           

Отправлено 23 Ноябрь 2017 - 00:13

как я знаю глобальные записываются в оперативную память, а локальные работают только по программе. А тут это не работает.

возможно будут не совсем корректен, но я постараюсь

глобальные переменные видны на всей программе, а локальные только в той конструкции, в которой объявлены и тем, которые происходят внутри конструкции, в которой объявлена переменная(цикл, условие, функция и т.п.)

область видимости обзывается вроде
https://ru.wikipedia...ласть_видимости

локальные пошустрее будут


Сообщение отредактировал ivan52945: 23 Ноябрь 2017 - 00:14

  • Totoro это нравится

#6 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 23 Ноябрь 2017 - 01:13   Лучший Ответ

Услышал от qwertyMan'а что глобальные переменные зло и решил заменить все глобальные в приложении на локальные и перестало работать.

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

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

  • lokin135 это нравится

#7 Оффлайн   FelixBanan

FelixBanan
  • Автор темы
  • Пользователи
  • Сообщений: 46
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

           

Отправлено 23 Ноябрь 2017 - 07:20

Глобальные переменные не совсем зло. Они всё-таки необходимы для некоторых целей. Память занимают любые переменные, но локальные работают быстрее. Правда, есть нюансы, о которых где-то рассказывал ECS: если часто вызывать функцию, внутри которой определена локальная переменная, то вместо ускорения можно получить замедление. Выход из ситуации заключен в создании локальных переменных на уровнях выше часто вызываемых функций. К слову, затраты на доступ к глобальной переменной эквивалентны затратам на доступ к полю локальной таблицы.Главная же особенность глобальных переменных заключена в том, что они доступны любым программам, запущенным в данном окружении. С одной стороны, это ведёт к замусориванию глобального окружения и созданию помех одними запускаемыми программами другим программам, а с другой, глобальне переменные при грамотном использовании дают программам механизм обмена данными через глобальное окружение. И если не стоит именно такая задача, то глобальные переменные создают больше проблем, чем решают их.

разжевано просто полностью =) спасибо

#8 Оффлайн   NEO

NEO
  • Пользователи
  • Сообщений: 1 691
  • Уровень сигнала: 3,96%
  • В игре: 24 час. 15 мин.
  • ГородСолнце

Награды

   2                        

Отправлено 23 Ноябрь 2017 - 15:21

Глобальные переменные не совсем зло.

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


Сообщение отредактировал NEO: 23 Ноябрь 2017 - 15:22

  • mrlobaker это нравится





Темы с аналогичным тегами Lua

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика