Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Флаги - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Флаги
Оценка: -----

#1
Пользователь офлайн   m1n1vv 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Знаете ли вы, что можно хранить не более 32 переменных, которые могут принимать значения логического типа true/false, в одной переменной? Вы не только сэкономите память, но также наведете порядок в своем коде. С использованием char можно будет хранить только 8 флагов!

Если у вас есть, допустим, 100 переменных логического типа, то вы будете использовать 195 Кб пространства. Используя 4 массива с флагами, вы затратите только 8 Кб. Результат будет тот же, но вы сэкономите 187 Кб пространства.


Объявление:

enum
	PlayerFlags: (<< = 1)
	{
		LOGGED = 1, //очень важно, чтобы значение первой константы было 1
		ANIMLOADING,
		RESPAWN
	};

new
	PlayerFlags:Player[MAX_PLAYERS];


Как это используется:

//приравняет все флаги к 0
Player[playerid] = PlayerFlags:0;


//значение флага ANIMLOADING будет истина (1)
Player[playerid] |= ANIMLOADING;


//значение флага ANIMLOADING будет ложь (0)
Player[playerid] &= ~ANIMLOADING;


//установит противоположное значение флага ANIMLOADING
Player[playerid] ^= ANIMLOADING;


//вернет значение флага ANIMLOADING
Player[playerid] & ANIMLOADING;


Автор урока: Slice
Перевел и доработал: m1n1vv

Сообщение отредактировал m1n1vv: 13 Ноябрь 2017 - 18:58

4

#2
Пользователь офлайн   VVWVV 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Цитата

С использованием char можно будет хранить только 8 переменных!

Не переменных, а флагов.
0

#3
Пользователь офлайн   m1n1vv 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияVVWVV (13 Сентябрь 2017 - 17:10) писал:

Не переменных, а флагов.

Да, точно
0

#4
Пользователь офлайн   PHARA_OH 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияm1n1vv (13 Сентябрь 2017 - 16:32) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


То есть, лучше использовать флаги вместо char?
0

#5
Пользователь офлайн   Sonic X 

  • Х_X
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPHARA_OH (04 Февраль 2018 - 10:04) писал:

То есть, лучше использовать флаги вместо char?

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

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

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


Вот только в реальности вряд ли можно встретить структуру инфы об игроке с 100 и более переменными типа bool. Разве что если есть какая-нибудь система достижений - вот такое точно следует переводить на флаги.

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

Сообщение отредактировал Sonic X: 04 Февраль 2018 - 14:29

0

#6
Пользователь офлайн   SooBad 

  • Псевдо-переферийный магус
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPHARA_OH (04 Февраль 2018 - 10:04) писал:

То есть, лучше использовать флаги вместо char?

Второй суб-массив с чп 'флагов' может быть объявлен и с оператором char.
Вариант с флагами уместен только для булевых переменных, поэтому, вариант с ними не прокатит для переменных флотабельного и строкового типа.

Сообщение отредактировал SooBad: 04 Февраль 2018 - 20:07

0

#7
Пользователь офлайн   wormbit 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Что за цифры?
В Pawn одна переменная (или элемент массива) занимает 4 байта. 100 элементов будет занимать 400 байт, что равно - 0.4 Кб!

Сообщение отредактировал wormbit: 27 Март 2018 - 19:50

0

#8
Пользователь офлайн   SooBad 

  • Псевдо-переферийный магус
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияwormbit (27 Март 2018 - 18:34) писал:

Что за цифры?
В Pawn одна переменная (или элемент массива) занимает 4 байта. 100 элементов будет занимать 400 байт, что равно - 0.4 Кб!

Это магия. Высшая магия Pawn.
0

#9
Пользователь офлайн   GAWESOME 

  • Павно-программист
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSooBad (27 Март 2018 - 19:50) писал:

Это магия. Высшая магия Pawn.


*И эта магия вне Pawn и его коммьюнити, которое не знает про унарный минус, не действует.

Сообщение отредактировал GAWESOME: 27 Март 2018 - 23:46

0

#10
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияm1n1vv (13 Сентябрь 2017 - 16:32) писал:

Если у вас есть, допустим, 100 переменных логического типа, то вы будете использовать 195 Кб пространства. Используя 4 массива с флагами, вы затратите только 8 Кб. Результат будет тот же, но вы сэкономите 187 Кб пространства.


Ну про все вытекающие последствия уже написали выше, предоставив цитату Daniel_Cortez.

Меня лишь удивляет то, как подана эта информация. Начнём с того, что байты перепутаны с килобайтами, так ещё и слова о том, что будет сэкономлено 187 байт (может и не 187. Лень пересчитывать), преподносятся так, будто от этого много чего изменится.
Единственное, что вы получите от флагов - это потраченное время на написание и последующую поддержку такого кода. Ради экономии крайне мизерного объёма памяти вы лишь усложните свой код и не более того. Память - это не тот ресурс, ради которого стоит жертвовать производительностью или простотой кода. И в Pawn флаги, объективно, не пригодятся ровным счётом никогда просто потому что платформа, на которой запускаются сервера, не имеет дефицита памяти (вы же не микропроцессоры тут прошиваете, где и правда каждый бит на счету).

И если вы пришли в эту тему с намерением использовать флаги в своих скриптах: мой вам совет - забудьте о них. О флагах можно узнать сугубо в качестве расширения кругозора. Но объективных вариантов их применения в SA-MP вы не найдёте.
2

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей