PDA

Просмотр полной версии : [Function] GetStackSize - узнать размер стека



Daniel_Cortez
09.11.2014, 19:30
Очень простая функция, которая, как понятно из названия, узнаёт размер стека у скрипта.

stock GetStackSize()
{ // by Daniel_Cortez (www.pro-pawn.ru)
const BYTES_TO_ADD = (cellbits/charbits);
#emit lctrl 2
#emit move.alt
#emit lctrl 3
#emit sub
#emit add.c BYTES_TO_ADD
#emit retn
return 0;
}



Полезно, если Вы устали от ложных багрепортов из-за того, что у кого-то не работает RLS и эти кто-то винят во всех его багах Ваш инклуд/плагин.
В этом случае можно сделать так, чтобы ваша работа просто не запускалась на нубомодах, в которых используется #pragma dynamic - problem solved.

// по умолчанию размер стека - 16384 байта, если больше - использовалась #pragma dynamic
if(GetStackSize() > 16384)
{
print("Noob gamemode detected");
SendRconCommand("exit");
}


Внимание! Данный способ не будет работать в фильтрскриптах - для них сервер выделяет отдельные секции стека.

Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)


Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено.

DeimoS
10.11.2014, 13:50
А если у меня код оптимизирован, но всё равно нужно выделить больше памяти для стека? Например, есть массивы, в которых хранится описание сервера. Или же просто куча мелких массивов заполнили стек?
P.S. Это просто первые пришедшие на ум примеры

Daniel_Cortez
10.11.2014, 16:59
А если у меня код оптимизирован, но всё равно нужно выделить больше памяти для стека? Например, есть массивы, в которых хранится описание сервера.
Разбить описание на глобальные строковые переменные длиной до 512 символов (всё равно на больших строках стоковый компилятор крашит), затем скрепить их воедино, как показано здесь (http://pro-pawn.ru/showthread.php?10012).


Или же просто куча мелких массивов заполнили стек?
Насколько мелких? И сколько вызовов? Или под "мелкими" имелись в виду массивы по 256 или 512 ячеек, да ещё и в рекурсивной функции, небось? В любом случае это не нормально.
В реальных же условиях, если грамотно рассчитывать размер локальных массивов и, по возможности, упаковывать данные, будет довольно трудно попасть в ситуацию, в которой не уложишься в 4096 ячеек.