Перейти к содержанию
    

Глобальная или локальная переменная.

У меня в цикле в 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. в цикле (что делает?) крутится

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...если создать локально то при каждом заходе в функцию переменная будет создаваться в стэке.

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

 

не то что бы это мне как то мешало но вообще как лучше ?

Что значит "как лучше"? Нужна переменная result в глобальном виде? Нет - делайте локальной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не то что бы это мне как то мешало но вообще как лучше ?

У каждого своя правда.

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

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

вот где между этими точками и болтается правда :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

с точки зрения скорости обращение к глобальной переменной в RAM или локальной в стэк займет одинаковое количество инструкций. или я не прав?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

с точки зрения скорости обращение к глобальной переменной в RAM или локальной в стэк займет одинаковое количество инструкций. или я не прав?

Не будет стека - в большинстве случаев эта локальная переменная не уйдет дальше регистра процессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не будет стека - в большинстве случаев эта локальная переменная не уйдет дальше регистра процессора.

а вообще да. что ей делать в стеке. получается локальная переменная экономит место и по скорости это оптимальное решение.

а что если локальных переменных больше чем регистров процесора? их примерно 10 тех что можно использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а что если локальных переменных больше чем регистров процесора? их примерно 10 тех что можно использовать.

Тогда что не влезет, отправится в стек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда что не влезет, отправится в стек.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

это в случае, если нет инструкций косвенной адресации. а где их сейчас нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это в случае, если нет инструкций косвенной адресации. а где их сейчас нет?

А если есть, это что-то меняет? Разница простая: при работе с переменной на стеке базовый адрес всегда рядом (в SP), для глобальной переменной его придется откуда-нибудь загрузить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...