Cappuccino*
Новичок
С Вами был Cappuccino*, удачного кодинга!Владокс написал(а):Здравствуйте
Решил прервать давний холивар, суть которого заключается в том, можно ли возвращать в PAWN строки, или нет
В PAWN изначальный размер стека (STK) - 16384 байт, не больше, не меньше
при выполнении кода, в стек загружается информация о текущем паблике: его индекс, аргументы, кол-во аргументов
стек очищается только после успешного выполнения паблика
посчитаем, сколько требуется паблику для успешного запуска:
даже если посчитать паблик с максимальным кол-вом аргументов (32), то в стеке остается:PHP:4 байта - адрес паблика, извлекается через funcidx 4 байта - кол-во аргументов, извлекается через numargs 4 байта - адрес кода, откуда был вызван паблик (иначе говоря, backtrace) 0..256 байт - аргументы (макс 32), собсна читаются прямо из стек
ЭТО ЖЕ МНОГО?!PHP:16384 - (4 * 3) - 256 = 16116 байт
НЕТ!
при создании каждой ЛОКАЛЬНОЙ переменной в стеке выделяется место под нее
например:
А теперь, протестируем код, который возвращает массив в 2048 ячеек:PHP:new level; // -4 байта из стека new level[256]; // (-256 * 4) = -1024 байт из стека new level[256 char]; // -256 байт из стека new level[2048]; // -8192 байт из стека (почти половина!)
Запустите мод с этим кодом, и вот результат:PHP:main() { new dest[2048]; dest = get_crash(); print(dest); } stock get_crash() { new src[2048] = "Этот код заставит сервер вывести ошибку Runtime Error"; return src; }
Так что мой вам совет: старайтесь не возвращать строки функциями ВООБЩЕ, иначе это может привести к пагубным последствиям!PHP:[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)"
Последнее редактирование модератором:
