Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глобальная или локальная переменная.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
У меня в цикле в main.c крутиться функция.
Код
while (1)
{

    void Func(void)
    {
         uint32_t result;
         result = ReadTask(task_idx, &ram_task);
         If (result)
         {
              result = EvaluateTask(&ram_task);
              if (result)  //do something
         }
    }

}

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

P.S. в цикле (что делает?) крутится
aaarrr
Цитата(Jenya7 @ Nov 30 2016, 15:41) *
...если создать локально то при каждом заходе в функцию переменная будет создаваться в стэке.

Или не будет, если компилятор не дурак (а он не дурак).

Цитата(Jenya7 @ Nov 30 2016, 15:41) *
не то что бы это мне как то мешало но вообще как лучше ?

Что значит "как лучше"? Нужна переменная result в глобальном виде? Нет - делайте локальной.
HardEgor
Цитата(Jenya7 @ Nov 30 2016, 19:41) *
не то что бы это мне как то мешало но вообще как лучше ?

У каждого своя правда.
- с точки зрения скорости и экономии памяти, лучше делать все переменные глобальными и весь код inline.
- с точки зрения поддерживаемости кода, разделения функционала и т.д., лучше не иметь глобальных переменных и разбивать на функции.
вот где между этими точками и болтается правда sm.gif
Jenya7
с точки зрения скорости обращение к глобальной переменной в RAM или локальной в стэк займет одинаковое количество инструкций. или я не прав?
aaarrr
Цитата(Jenya7 @ Nov 30 2016, 16:04) *
с точки зрения скорости обращение к глобальной переменной в RAM или локальной в стэк займет одинаковое количество инструкций. или я не прав?

Не будет стека - в большинстве случаев эта локальная переменная не уйдет дальше регистра процессора.
Jenya7
Цитата(aaarrr @ Nov 30 2016, 19:18) *
Не будет стека - в большинстве случаев эта локальная переменная не уйдет дальше регистра процессора.

а вообще да. что ей делать в стеке. получается локальная переменная экономит место и по скорости это оптимальное решение.
а что если локальных переменных больше чем регистров процесора? их примерно 10 тех что можно использовать.
aaarrr
Цитата(Jenya7 @ Nov 30 2016, 16:26) *
а что если локальных переменных больше чем регистров процесора? их примерно 10 тех что можно использовать.

Тогда что не влезет, отправится в стек.
Jenya7
спасибо всем.
zltigo
QUOTE (aaarrr @ Nov 30 2016, 15:29) *
Тогда что не влезет, отправится в стек.

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

quarter
Цитата(zltigo @ Nov 30 2016, 18:25) *
И даже если в стеке адресация может быть короче и быстрее, нежели по глобальному адресу...

это в случае, если нет инструкций косвенной адресации. а где их сейчас нет?
aaarrr
Цитата(quarter @ Nov 30 2016, 20:25) *
это в случае, если нет инструкций косвенной адресации. а где их сейчас нет?

А если есть, это что-то меняет? Разница простая: при работе с переменной на стеке базовый адрес всегда рядом (в SP), для глобальной переменной его придется откуда-нибудь загрузить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.