Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 3 из 3
  1. #1
    Аватар для h3ckphy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    12.05.2020
    Сообщений
    20
    Репутация:
    1 ±

    static const. Сегмент данных. Оптимизация.

    Привет. Сразу кину код, который не понимаю, я взял его где-то на форуме.
    Код:
    stock ShowDialogRegister(playerid) {
        static const text_box_register[] =
            "{ffffff}Добро пожаловать на сервер Atlant Role Play!\n" \
            "{ffffff}Ваш аккаунт %s не найден в нашей базей данных\n\n" \
            "Пройдите процесс регистрации\n" \
            "Введите пароль\n\n" \
            "Максимальная длина пароля - 15 символов";
    
        new string[sizeof(text_box_register) - 2 + MAX_PLAYER_NAME + 1];
        format(string, sizeof(string), text_box_register, PlayerInfo[playerid][Name]);
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, !"{1976D2}Регистрация", string, !"Далее", !"Отмена");
    }
    В теме, откуда я взял этот код, человек спрашивает, можно ли как-то еще оптимизировать этот кусок кода. Ему говорят, что все уже по максимуму оптимизировано, все норм. И постоянно вижу, что советуют делать именно так: объявлять строку как static const.
    Почему используется "static const"? const понятно, почему. Строка не будет меняться. А static для чего? Согласно правилам, если объявить переменную как static внутри функции, то она не будет удаляться из памяти между вызовами функции. Ок. Значит, она хранится не в стеке, а в другом месте - в некоем "сегменте данных". Я хорошо понимаю, что такое стек, но можете объяснить мне что такое "сегмент данных"? Плюс я не понимаю, зачем так делать? Хранить эту строку на постоянной основе где-то там в памяти, вместо того, чтобы она при каждом вызове заново конструировалась, когда понадобится, она ведь не такая большая даже. Есть ли какие-нибудь тесты, которые наглядно демонстрируют преимущества данного подхода?

  2. #2
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от h3ckphy Посмотреть сообщение
    Привет. Сразу кину код, который не понимаю, я взял его где-то на форуме.
    Код:
    stock ShowDialogRegister(playerid) {
        static const text_box_register[] =
            "{ffffff}Добро пожаловать на сервер Atlant Role Play!\n" \
            "{ffffff}Ваш аккаунт %s не найден в нашей базей данных\n\n" \
            "Пройдите процесс регистрации\n" \
            "Введите пароль\n\n" \
            "Максимальная длина пароля - 15 символов";
    
        new string[sizeof(text_box_register) - 2 + MAX_PLAYER_NAME + 1];
        format(string, sizeof(string), text_box_register, PlayerInfo[playerid][Name]);
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, !"{1976D2}Регистрация", string, !"Далее", !"Отмена");
    }
    В теме, откуда я взял этот код, человек спрашивает, можно ли как-то еще оптимизировать этот кусок кода. Ему говорят, что все уже по максимуму оптимизировано, все норм. И постоянно вижу, что советуют делать именно так: объявлять строку как static const.
    Почему используется "static const"? const понятно, почему. Строка не будет меняться. А static для чего? Согласно правилам, если объявить переменную как static внутри функции, то она не будет удаляться из памяти между вызовами функции. Ок. Значит, она хранится не в стеке, а в другом месте - в некоем "сегменте данных". Я хорошо понимаю, что такое стек, но можете объяснить мне что такое "сегмент данных"? Плюс я не понимаю, зачем так делать? Хранить эту строку на постоянной основе где-то там в памяти, вместо того, чтобы она при каждом вызове заново конструировалась, когда понадобится, она ведь не такая большая даже. Есть ли какие-нибудь тесты, которые наглядно демонстрируют преимущества данного подхода?
    Так, полегче. Начнем:
    1) Сегмент данных - просто вся оставшаяся кроме стека оперативная память. По сути стек - часть сегмента данных, который может самоочищаться.
    2) Про использование static + new для форматирования можно почитать здесь.
    Вообще такой способ хорош тем, что string имеет ровно столько ячеек, сколько может максимум понадобиться.

  3. #3
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Можно еще сделать акцент на том, что увеличить объем памяти дешевле, нежели увеличить производительность. Поэтому не есть плохо занять долю памяти. Хуже каждый раз выделять память и проводить инициализацию ячеек.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •