PDA

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



BadPawn
27.03.2016, 08:00
Всем салют.

Вопрос по флагам. Для начала покажу код, затем скажу, а то нихрена не объясню нормально. )))

1.

enum Flags:(<<= 1)
{
LOGGED = true,
//тут будут остальные переменки с bool значением
}
new Flags:pFlag[MAX_PLAYERS];

2.

new bool:pLogged[MAX_PLAYERS char];

Сам вопрос: что эффективнее? почему?

Слова автора:

Если вы будете использовать 100 переменных типа bool для каждого игрока (MAX_PLAYERS), то вы будете тратить 195 Кб памяти.
Однако, если вы будете использовать 4 массива с флагами, то вы затратите только 8 КБ.
Т.е выходит, что вы сэкономите 187 КБ, довольно не плохо, правда?

Искал урок по #emit, наткнулся на это, и сильно таки заинтересовал вопрос, где правда.

Daniel_Cortez
27.03.2016, 10:10
Сам вопрос: что эффективнее? почему?
Смотря, что для вас важнее: производительность или расход памяти.
В одной ячейке 32 бита (4 байта) и если использовать их все, то можно нехило сэкономить память. Но следует учесть и то, что для достижения такой экономии при каждом обращении к переменной приходится выполнять побитовые сдвиги, сложение, etc., из-за чего доступ к переменной с флагами становится медленнее, чем к обычной переменной, т.е. приходится жертвовать производительностью.

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


Если вы будете использовать 100 переменных типа bool для каждого игрока (MAX_PLAYERS), то вы будете тратить 195 Кб памяти.
Однако, если вы будете использовать 4 массива с флагами, то вы затратите только 8 КБ.
Вот только в реальности вряд ли можно встретить структуру инфы об игроке с 100 и более переменными типа bool. Разве что если есть какая-нибудь система достижений - вот такое точно следует переводить на флаги.

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

TheMallard
27.03.2016, 17:01
player_logged_in[MAX_PLAYERS char];


будет достаточно :D

vovandolg
01.04.2016, 05:07
Смотря, что для вас важнее: производительность или расход памяти.
В одной ячейке 32 бита (4 байта) и если использовать их все, то можно нехило сэкономить память. Но следует учесть и то, что для достижения такой экономии при каждом обращении к переменной приходится выполнять побитовые сдвиги, сложение, etc., из-за чего доступ к переменной с флагами становится медленнее, чем к обычной переменной, т.е. приходится жертвовать производительностью.


Зачарованная переменная станет медленнее PVar?

TheMallard
09.04.2016, 03:25
Зачарованная переменная станет медленнее PVar?

обычная < флаг < пвар

vovandolg
09.04.2016, 08:48
обычная < флаг < пвар

обычная то обычная, а зачарованная где)

TheMallard
09.04.2016, 10:35
Обычная и char по идее должны быть одинаково быстрыми.

DeimoS
09.04.2016, 13:06
обычная то обычная, а зачарованная где)

char - всего лишь оператор. Пройди в раздел с уроками и прочти статью на эту тему от DC. Там всё рассказано