реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Глобальная или локальная переменная.
Jenya7
сообщение Nov 30 2016, 12:41
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



У меня в цикле в 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 можно создать локально или глобально. если создать локально то при каждом заходе в функцию переменная будет создаваться в стэке.
не то что бы это мне как то мешало но вообще как лучше ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 30 2016, 12:48
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

P.S. в цикле (что делает?) крутится


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2016, 12:48
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

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

Что значит "как лучше"? Нужна переменная result в глобальном виде? Нет - делайте локальной.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Nov 30 2016, 12:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



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

У каждого своя правда.
- с точки зрения скорости и экономии памяти, лучше делать все переменные глобальными и весь код inline.
- с точки зрения поддерживаемости кода, разделения функционала и т.д., лучше не иметь глобальных переменных и разбивать на функции.
вот где между этими точками и болтается правда sm.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 30 2016, 13:04
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



с точки зрения скорости обращение к глобальной переменной в RAM или локальной в стэк займет одинаковое количество инструкций. или я не прав?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2016, 13:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Не будет стека - в большинстве случаев эта локальная переменная не уйдет дальше регистра процессора.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 30 2016, 13:26
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

а вообще да. что ей делать в стеке. получается локальная переменная экономит место и по скорости это оптимальное решение.
а что если локальных переменных больше чем регистров процесора? их примерно 10 тех что можно использовать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2016, 13:29
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Тогда что не влезет, отправится в стек.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 30 2016, 14:09
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



спасибо всем.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 30 2016, 15:25
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
quarter
сообщение Nov 30 2016, 17:25
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 17-12-15
Пользователь №: 89 731



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

это в случае, если нет инструкций косвенной адресации. а где их сейчас нет?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2016, 18:25
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

А если есть, это что-то меняет? Разница простая: при работе с переменной на стеке базовый адрес всегда рядом (в SP), для глобальной переменной его придется откуда-нибудь загрузить.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th April 2024 - 23:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016