- Регистрация
- 8 Июн 2011
- Сообщения
- 185
- Лучшие ответы
- 0
- Репутация
- 55
Здравствуйте
Решил прервать давний холивар, суть которого заключается в том, можно ли возвращать в PAWN строки, или нет
В PAWN изначальный размер стека (STK) - 16384 байт, не больше, не меньше
при выполнении кода, в стек загружается информация о текущем паблике: его индекс, аргументы, кол-во аргументов
стек очищается только после успешного выполнения паблика
посчитаем, сколько требуется паблику для успешного запуска:
даже если посчитать паблик с максимальным кол-вом аргументов (32), то в стеке остается:
ЭТО ЖЕ МНОГО?!
НЕТ!
при создании каждой ЛОКАЛЬНОЙ переменной в стеке выделяется место под нее
например:
А теперь, протестируем код, который возвращает массив в 2048 ячеек:
Запустите мод с этим кодом, и вот результат:
Так что мой вам совет: старайтесь не возвращать строки функциями ВООБЩЕ, иначе это может привести к пагубным последствиям!
Авторские права: BJIADOKC
Решил прервать давний холивар, суть которого заключается в том, можно ли возвращать в PAWN строки, или нет
В PAWN изначальный размер стека (STK) - 16384 байт, не больше, не меньше
при выполнении кода, в стек загружается информация о текущем паблике: его индекс, аргументы, кол-во аргументов
стек очищается только после успешного выполнения паблика
посчитаем, сколько требуется паблику для успешного запуска:
Код:
4 байта - адрес паблика, извлекается через funcidx
4 байта - кол-во аргументов, извлекается через numargs
4 байта - адрес кода, откуда был вызван паблик (иначе говоря, backtrace)
0..256 байт - аргументы (макс 32), собсна читаются прямо из стека
Код:
16384 - (4 * 3) - 256 = 16116 байт
НЕТ!
при создании каждой ЛОКАЛЬНОЙ переменной в стеке выделяется место под нее
например:
PHP:
new level; // -4 байта из стека
PHP:
new level[256]; // (-256 * 4) = -1024 байт из стека
PHP:
new level[256 char]; // -256 байт из стека
PHP:
new level[2048]; // -8192 байт из стека (почти половина!)
PHP:
main()
{
new dest[2048];
dest = get_crash();
print(dest);
}
stock get_crash()
{
new src[2048] = "Этот код заставит сервер вывести ошибку Runtime Error";
return src;
}
Код:
[23:45:52] [debug] Run time error 3: "Stack/heap collision (insufficient stack size)"
[23:45:52] [debug] Stack index (STK) is 0x13EE0, heap index (HEA) is 0x13EF4
[23:45:52] [debug] AMX backtrace:
[23:45:52] [debug] #0 00003ddc in public main () from devastation.amx
[23:45:52] Script[gamemodes/devastation.amx]: Run time error 3: "Stack/heap collision (insufficient stack size)"
Авторские права: BJIADOKC