Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 6
    Гостей: 1
    Пользователи: - отсутствуют
    Роботы: robot Bot, crawl Bot, robot Bot, crawl Bot, Yahoo Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 1-10-2012, 12:29 Просмотров: 6470

    Урок 19. Отличие new от static при создании переменных.

    Тем кто знает отличие new от static читать данный урок нет необходимости, нового вы ни чего не узнаете.
    А тем кто не понимал в чем отличие, наверное будет полезно прочитать данную статью.

    Оба рассматриваемых оператора создают переменную, но у них существует определенная разница.

    Оператор NEW


    Для начала давайте рассмотрим оператор new на примере вот такой функции:
    public func_new(){// Какая то функция
        new i // создание переменной
        server_print("i=%d",i) // вывод значения переменной
        i++ // прибавляем 1 к переменной
        server_print("i+1 i=%d",i)//выводим переменную с +1
        
    }

    Если вызвать данную функцию два раза подряд, то результат будет такой:
    cmd_new
    i=0
    i+1 i=1

    cmd_new
    i=0
    i+1 i=1

    cmd_new - Это команда вызывающая функцию func_new.
    Как видно результат одинаковый, это потому что оператор new создает переменную в памяти каждый раз при объявлении, то есть старая была уничтожена.

    Оператор Static


    Если в данном коде заменить оператор new на static то получится вот такой код:
    public func_static(){//Другая функция
        static i// заменили new на static
        server_print("i=%d",i)
        i++
        server_print("i+1 i=%d",i)    
    }

    И результат работы уже будет такой:
    cmd_static
    i=0
    i+1 i=1
    cmd_static
    i=1
    i+1 i=2

    Как видно из результата - переменная сохранила свое значение, так как оператор static не пересоздает переменную, а продолжает работать с ране созданной.

    Логично предположить что многие сразу скажут - " Так это же обычная глобальная переменная", но это не так, глобальная переменная доступна везде, а переменная созданная с помощью static внутри какой то функции, будет доступна только там.

    Static - рекомендуется использовать там, где происходит очень частое использование.

    Рабочий пример:
    #include <amxmodx>
    #include <amxmisc>

    #define PLUGIN "[http://amxxmodx.ru] New VS Static"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        register_concmd("cmd_new","func_new")
        register_concmd("cmd_static","func_static")
        
        register_concmd("cmd_vs","func_vs")
    }
    public func_new(){
        new i
        server_print("i=%d",i)
        i++
        server_print("i+1 i=%d",i)
        
    }
    public func_static(){
        static i
        server_print("i=%d",i)
        i++
        server_print("i+1 i=%d",i)    
    }

    В примере нет глобальных переменных, но в функции func_static переменная будет сохранять свое значение. И это не глобальная переменная, кто не верит, попробуйте создать третью функцию и обратиться к переменной i.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Урок 19. Отличие new от static при создании переменных.
    2391063

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Спасибо, всегда хотел узнать разницу
    gavrilyuc

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    На сколько знаю почти все Скриптёры не пользуются этим что бы оптимизировать свой код от лишней памяти.
    артист

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Чего оптимизировать, если в зп для каждого оружия 48 чинков регистрируется...

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама