PDA

Просмотр полной версии : [Вопрос] Глобальный или локальный массив?



geneff
30.03.2018, 12:00
Здравствуйте. Как лучше, создать глобальный массив и не парится с создаванием новых массивов или же лучше создавать каждый раз новый массив для форматирования?

DeimoS
30.03.2018, 13:46
Инициализируя локальные массивы, ты не создаёшь новые массивы, а лишь резервируешь память стэка.
Стэк можно представить как один большой массив. Когда ты создаёшь переменную, нужное число из стэка "закрепляется" за этой переменной. Никакой новой памяти не выделяется.
А вот создавая глобальный массив, ты именно выделяешь новую память.

Хотя дело даже не в выделении или не выделении памяти, а в том, что с глобальным массивом повышается шанс допустить ошибку.
Например, у тебя есть код, в котором идёт работа с глобальным массивом и результат выдаётся в чат.
new gString[3000];

CMD:commandname(playerid, params[])
{
//...
format(gString, sizeof(gString), "Текст");
SendClientMessage(playerid, -1, gString);
return 1;
}


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

public OnPlayerText(playerid, text[]);
{
//...
new string[MAX_CHATBUBBLE_LENGTH+1];
format(string, sizeof(string), "Текст");
SendClientMessage(playerid, -1, gString);//Вот тут забыл поменять
return 0;
}
Компилятор не выдаст никаких ошибок, так как функция gString существует для той строки, где мы забыли её заменить. Но вот код уже не будет работать так, как нужно. И тебе придётся тратить дополнительное время на то, чтоб обнаружить причину, по которой не выдаётся сообщение.

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


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



UPD: Так как автор темы поставил "Спасибо" и больше никто не отписался, закрою тему и перемещу в ахив. Если вдруг у кого-то есть что добавить касаемо данного вопроса, можете отписать в личку и я открою тему