Цитата:
Сообщение от
Elrmrnt-Kritik
Коль уж вопросы начали затрагивать маркеры, а значит и виды памяти, наверное, было бы неплохо переименовать эту тему... Вообще, хотел узнать за декларирование функций (forward), потому что в интернете это расписано крайне... Даже не знаю как сказать, не то что бы сложно, просто непонятно зачем оно надо.
Вот public делает переменную или функцию (дословно) общественной. Ну, будет к ней возможность обратиться из другого файла (ведь верно?). Это обращение осуществляется через CallRemoteFunction (для функций) и никак (серьезно? :sad:) (для переменных). Я бы понял, если бы forward был нужен для того, чтобы в другом файле эта функция не была неизвестной. Но ведь forward суется не в этот файл, а в мод. А значит смысл от него каков?
* под файлом выше я подразумевал какие-нибудь filterscripts.
В одной из тем шла речь про суть public-функций. Мол, они дают о себе знать в некой хеш-таблице. А что это за таблица и где можно про нее получить конкретную информацию? В официальной документации есть об этом речь. Единственное полезное, что я понял оттуда - нежелательно создание "лишних" public-функций (не нужна - не делай), мол, большая хэш-таблица ухудшается в производительности, а потому работа с public-функциями будет уже медленнее. А вот, например, тот факт, что размер хэш-таблицы ограничен и при его исчерпании нужно увеличить этот самый размер, мне уже непонятен. Каким образом его можно менять и как получить общее представление о том, чему равен максимальный размер хэш-таблицы? Или он вообще в процессе работы сервера увеличивается сам, в зависимости от частоты вызова тех или иных функций. Была информация про функции, которые должны влиять на эту таблицу, но сами функции в игровом моде не работают (якобы символ не объявлен).
Очень кратко:
Спецификатор forward необходим для декларирования всех функций. Тем не менее в функциях со спецификатором stock немного другая схема работы: он требует forward-декларацию только тогда, когда функция возвращает значение с определённым тегом.
Функции, объявленные с помощью спецификатора public являются публичным. Их названия хранятся в скомпилированном AMX файле (названия других функций там не хранится).
Это не хеш-таблица, а обычная отсортированная таблица (это весьма очевидно, ведь используется бинарный поиск). При использовании большого количества таких функций произойдёт "раздувание" файла, то есть его размера. Если бы была таблица, то доступ к элементу занимал O(1), а не O(log n) при бинарном поиске.
Вообще можно поменять размер блока (реаллацировать), хранящего байт-код, но это будет странно, ведь это вовсе не нужно. Тем более, придётся перехватить функцию загрузки AMX-скриптов.
Цитата:
Получение как таковых адресов тебе ничего не даст, ибо резервация в таблице паблик-функций происходит автоматически, посредством смещения к CIP от адреса последней функции (чтобы понять, что это такое, тебе стоит также почитать документацию к языку), а манипулировать адресами (то бишь делать переадресацию, либо дублировать функции, как в более расширенных языках), мы не можем.
Странно, как тогда устроен YSI? Да, там хаки, но работает ж... =)