PDA

Просмотр полной версии : [Вопрос] Static



Unreal
21.10.2015, 22:03
Всем привет.

Сейчас у меня появился такой вопрос, когда читал тему (http://pro-pawn.ru/showthread.php?8775-%D0%A1%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%B2-SA-MP-(%D0%9F%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4))
и заметил




public OnPlayerUpdate( playerid )
{
static // Я использую здесь статистические переменные, ибо они не будут вызываться каждый раз
s_Keys,
s_UpDown,
s_LeftRight
;




static // Я использую здесь статистические переменные, ибо они не будут вызываться каждый раз

я так понял что можно в сек. таймере вместо

new string[128];
будет лучше использовать (?)

static string[128];

Спасибо.

wAx
22.10.2015, 07:45
Static не будет очищатся при каждой итерации вроде

Daniel_Cortez
22.10.2015, 11:30
static в первом примере используется для того, чтобы снизить требования к памяти: для создания и уничтожения локальной переменной с помощью new уходит 2 инструкции: push <начальное значение> (эта инструкция занимаеи в памяти 8 байт) и stack 4 (ещё 8 байт), а со static переменная не создаётся в стеке, а всё время находится в секции данных и занимает 4 байта, при этом её нельзя ни создать, ни уничтожить, как в стеке. В итоге имеем 16 байт с new и 4 со static - отсюда и экономия.

Что касается массивов, то с new на их создание и уничтожение тратится от 40 до 44 байт (инструкции варьируются в разных случаях), поэтому выгода будет только в том случае, когда размер массива меньше 10 (40/4) ячеек. Правда, при создании массива с помощью new также будет затрачено время на инициализацию его ячеек изначальными значениями, но это время крайне мало и им можно пренебречь.

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


Tl;dr (http://lurkmore.to/Tl;dr): Если вы не разбираетесь во всём вышеописанном, лучше не используйте static.