Почему в pawn нельзя возвращать строку ?
Кто-то говорит на работоспособность кода не влияет , кто-то говорит влияет . Можно об этом написать подробно на след мифе ?
Вид для печати
Почему в pawn нельзя возвращать строку ?
Кто-то говорит на работоспособность кода не влияет , кто-то говорит влияет . Можно об этом написать подробно на след мифе ?
Хоть я когда-то и сам писал, что нельзя, но всё же можно. Просто нужно учитывать, что если ты, например, два раза подряд вызываешь одну функцию с возвратом, типа:
В стэке выделиться не 25 ячеек (24 ячейки под созданный массив внутри функции с возвратом и 1 ячейка (4 байта) на вызов этой самой функции), а уже 50 ячеек (как если бы мы создали 2 разных массива и записывали в них разные данные для вывода в одном сообщении).PHP код:
main()
{
printf("%s %s", PlayerName(), PlayerName());
}
stock PlayerName()
{
new pname[MAX_PLAYER_NAME] = "Azaza";
return pname;
}
Но, в то же время, если сделать так:
То выделяться будет всё так же 25 ячеек, ибо данные от второй функции перезапишут данные от первой (это лично моё понимание всей ситуации и оно может отличаться определениями от настоящей теоретической части)PHP код:
main()
{
printf("%s", PlayerName());
printf("%s", PlayerName());
}
stock PlayerName()
{
new pname[MAX_PLAYER_NAME] = "Azaza";
return pname;
}
В общем, разница между обычной работой с массивом и возвратом данных из функции заключается в том, что во втором случае ты ещё выделяешь память на вызов этой самой функции
Во всём остальном, по-сути, нет никаких минусов и если тебе действительно нужно возвращать строку - возвращай. Главное не забывай о первом примере, что я дал выше (о том, каким образом такие функции будут кушать память), дабы не словить потом краш из-за переполнения стэка :3
Всем привет
Поговорим о 4 мифе на ткнулся на соседнем портале: там автор утверждает что команды с использованием params[0],params[1] медленнее чем на переменных
А так же в гугле нашел тест где было показано на оборт что они быстрее переменных но перемены экономят пару байт памяти
а я еще в гугле пишут что
Никогда не создавай переменные в команде кроме переменных типа Float и Массивов. Это способствует не малой нагрузки на Стэк после чего приходится использовать #pragma dynamic
Так вот правда это или все чушь и можно спокойно использовать переменные в командах ?
Именно это (и не только) и было доказано в моих статьях.
А вот на это можно ссылки?
Верить голословным утверждениям (каковыми и являются 99% всех утверждений, особенно на всяких г-и) или статьям, подкреплённым доказательствами? Не знаю, вам решать.
А когда новые выпуски? Жду чем пополнить свои знания.
Раскрой еще один миф:
Использование одного или несколько видов таймеров в моде, их нагрузка и их типы(глобальные по типу SetTimer and цикл на всех игроков или же SetTimerEx по типу индивидуальных таймеров для игрока) их плюсы и минусы
А так-же миф: "Большое количество таймеров в моде - это большая нагрузка"
В последнюю статью о pVar, имхо, стоит добавить объяснение того, где pVar всё же стоит использовать и где они сэкономят память (хоть и тем, что не будет выделение новой).
Мифы о Pawn-скриптинге - #9
PVar занимает 58 байт, а переменная 4 байта, только вот PVar он как индивидуальный для игрока, а если создать переменную индивидуальную с массивом MAX_PLAYERS то, получается 1000*4 = 4000 байт, (без оператора char).Цитата:
Сообщение от Daniel_Cortez
Тогда получается, что PVar экономней в байтах. Или я не так Вас понял?
Цитата:
Это говорит о том, что под все 800 PVar'ов используется один общий блок памяти на каждого игрока, а значит все утверждения о том, что "PVar можно удалить и он больше не будет занимать место" ошибочны.
Проверим наш вывод. Найдём в файле class_player_var.cpp все случаи использования функций malloc/calloc/free и операторов new/delete.
Никакие функции для динамического выделения памяти там не используются, а new и delete используются только для резервирования/высвобождения места под строку, сохраняемую с помощью SetPVarString.
Остальное содержимое хранится в одном общем для всех 800 PVar'ов блоке памяти, который остаётся зарезервированным на протяжении всего времени нахождения игрока на сервере. Что и требовалось доказать.
Это лишь для одного игрока (58 * 800 = ~46400 байт).Цитата:
P.S.: Рассматривалось лишь утверждение про экомию памяти при "создании" и "удалении" PVar'ов (на самом деле память под них резервируется/высвобождается не в SetPVar(Int/Float/String)/DeletePVar, а при подключении/выходе игрока).
P.P.S: Отдельный блок памяти может выделяться под строку при использовании SetPVarString, оно же и высвобождается при вызове DeletePVar, но остальных типов данных и самих PVar'ов это не касается. Как результат, в некоторых случаях может быть целесообразно использование PVar'ов для хранения строк.
В массиве для одного игрока выделяется всего лишь 4 байта, не учитывая char.