В Pawn размер данных обычно измеряется не в байтах, а в ячейках. В версии для SA:MP ячейка занимает 4 байта, но в других версиях её размер может быть равен 2 или 8 байтам.
Типов данных, как таковых, в Pawn тоже нет (сам по себе интерпретатор умеет оперировать только целыми числами, а для вещественных введены нативные функции). Вместо них есть теги, которые были сделаны, чтобы было проще избежать ошибок при написании кода.
Каждая переменная в Pawn занимает 4 байта (1 ячейку), независимо от её тега, поэтому если объявить переменную с тегом bool, её размер всё равно будет 4 байта.
Докажем это на примере записи статуса авторизации у игроков.
Сделаем два образца: в одном объявим массив без указания тега и будем записывать в него 1/0, а в другом укажем тег bool и будем записывать true/false.
Образец 1:
#include <a_samp>
new player_login_status[MAX_PLAYERS] = {0, ...};
{
player_login_status[playerid] = 1;
}
{
player_login_status[playerid] = 0;
}
Образец 2:
#include <a_samp>
new bool:player_login_status[MAX_PLAYERS] = {false, ...};
{
player_login_status[playerid] = true;
}
{
player_login_status[playerid] = false;
}
Скомпилируем оба образца с ключами "-d0 -O1 -v2".
Образец 1:
Код:
Header size: 140 bytes
Code size: 92 bytes
Data size: 4000 bytes
Stack/heap size: 16384 bytes; estimated max. usage=9 cells (36 bytes)
Total requirements: 20616 bytes
Образец 2:
Код:
Header size: 140 bytes
Code size: 92 bytes
Data size: 4000 bytes
Stack/heap size: 16384 bytes; estimated max. usage=9 cells (36 bytes)
Total requirements: 20616 bytes
Никаких различий. Тогда сравним ассемблерные листинги:
Открыть/закрыть
Образец 1:
Код:
CODE 0 ; 0
;program exit point
halt 0
DATA 0 ; 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0
CODE 0 ; 8
proc ; OnPlayerConnect
; line 6
;$lcl playerid c
; line 7
zero.alt
load.s.pri c
idxaddr
move.alt
const.pri 1
stor.i
;$exp
zero.pri
retn
proc ; OnPlayerDisconnect
; line b
;$lcl reason 10
;$lcl playerid c
; line c
zero.alt
load.s.pri c
idxaddr
move.alt
zero.pri
stor.i
;$exp
zero.pri
retn
STKSIZE 1000
Образец 2:
Код:
CODE 0 ; 0
;program exit point
halt 0
DATA 0 ; 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
dump 0 0 0 0 0 0 0 0
CODE 0 ; 8
proc ; OnPlayerConnect
; line 6
;$lcl playerid c
; line 7
zero.alt
load.s.pri c
idxaddr
move.alt
const.pri 1
stor.i
;$exp
zero.pri
retn
proc ; OnPlayerDisconnect
; line b
;$lcl reason 10
;$lcl playerid c
; line c
zero.alt
load.s.pri c
idxaddr
move.alt
zero.pri
stor.i
;$exp
zero.pri
retn
STKSIZE 1000
Содержимое листингов тоже совпадает, а значит что объявление переменных с тегом bool для записи true/false вместо 1/0 абсолютно никак не влияет на генерируемый код и не приводит к экономии памяти. Что и требовалось доказать.
Тем не менее, можно сэкономить место в секции данных, если задать размер массива, используя оператор char.
Этот оператор работает следующим образом: X char = (X+3)/4.
Здесь 4 - кол-во байт в ячейке. Прибавление 3 сделано потому, что если просто разделить число на 4, то результат может оказаться неправильным. Например, для 6 char нельзя выделить полторы ячейки, нужно две.
Для доступа к байтам вместо ячеек нужно использовать фигурные скобки вместо квадратных.
#include <a_samp>
new player_login_status[MAX_PLAYERS char] = {0, ...};
{
player_login_status{playerid} = 1;
}
{
player_login_status{playerid} = 0;
}
Отчёт о компилцяии:
Код:
Header size: 140 bytes
Code size: 116 bytes
Data size: 1000 bytes
Stack/heap size: 16384 bytes; estimated max. usage=9 cells (36 bytes)
Total requirements: 17640 bytes
Размер секции кода увеличился на 20 байт (для доступа к байтам используются другие инструкции, нежели для доступа к ячейкам), но зато в секции данных удалось сэкономить 3000 байт.