PDA

Просмотр полной версии : [Вопрос] static const. Сегмент данных. Оптимизация.



h3ckphy
12.05.2020, 20:05
Привет. Сразу кину код, который не понимаю, я взял его где-то на форуме.


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 внутри функции, то она не будет удаляться из памяти между вызовами функции. Ок. Значит, она хранится не в стеке, а в другом месте - в некоем "сегменте данных". Я хорошо понимаю, что такое стек, но можете объяснить мне что такое "сегмент данных"? Плюс я не понимаю, зачем так делать? Хранить эту строку на постоянной основе где-то там в памяти, вместо того, чтобы она при каждом вызове заново конструировалась, когда понадобится, она ведь не такая большая даже. Есть ли какие-нибудь тесты, которые наглядно демонстрируют преимущества данного подхода?

SteveStage
12.05.2020, 21:31
Привет. Сразу кину код, который не понимаю, я взял его где-то на форуме.


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 для форматирования можно почитать здесь (https://pro-pawn.ru/showthread.php?13388-Подсчёт-размера-форматируемой-строки).
Вообще такой способ хорош тем, что string имеет ровно столько ячеек, сколько может максимум понадобиться.

Elrmrnt-Kritik
14.05.2020, 13:13
Можно еще сделать акцент на том, что увеличить объем памяти дешевле, нежели увеличить производительность. Поэтому не есть плохо занять долю памяти. Хуже каждый раз выделять память и проводить инициализацию ячеек.