PDA

Просмотр полной версии : [Вопрос] pawn.cfg с ключом -v2. Заинтересовало



franked
19.02.2016, 15:25
Приветствую вас,скриптеры! У меня к вам вопрос,по поводу информации о компиляции.

В общем у меня есть диалоги,которые я перебираю свитчем,ну в общем не в этом суть,и там в определенном кейсе,создаю локальную переменную,выглядит это примерно так:


case dTest:
{
static const msg[] = "Тут текст диалогового окна, и сюда %s попадет еще текст потом,после форматирования";
new str[sizeof(msg)+113];//ПРО ЭТУ ЛОКАЛЬНУЮ ПЕРЕМЕННУЮ ПОЙДЕТ РЕЧЬ
format(str, sizeof(str), msg, ПОДСТАВЛЯЮ_ДАННЫЕ);//Отформатировали к примеру
return ShowPlayerDialog(playerid, dTest, DIALOG_STYLE_MSGBOX, "Заголовок", str, "Да", "Нет");
}


И после компиляции,мне выводится:


Header size: 2104 bytes
Code size: 53352 bytes//Обратите внимание - 53352 байта
Data size: 79980 bytes//Обратите внимание - 79980 байтов
Stack/heap size: 16384 bytes; estimated max. usage=968 cells (3872 bytes)//Обратите внимание - 968 ячеек
Total requirements: 151820 bytes


И просто ради интереса,для теста,я переменную new str[sizeof(msg)+113]; переименовал так: static str[sizeof(msg)+113];
И вот что из этого вышло:



Header size: 2104 bytes
Code size: 53316 bytes//Здесь уменьшилось на 36 байтов
Data size: 81848 bytes //А здесь уже увеличилось на 1868 байтов
Stack/heap size: 16384 bytes; estimated max. usage=915 cells (3660 bytes)//Обратите внимание,уже - 915 ячеек и 3660 байтов
Total requirements: 153652 bytes


И получается,что мне от части выгоднее юзать static str[sizeof(msg)+113];, нежели new str[sizeof(msg)+113]; ? Или я не особо понял про эту информацию (имею в виду,инфу,что выводится при компиляции).

Просто,я читал вообще про оператор static. Там было сказано,что он как бы изменяет пределы видимости переменной. Т.е если я пишу это в инклюде (что я как раз и делаю),то в других местах я до нее не дотянусь (хотя она у меня и так локальна).

В общем,написав данный пост, у меня появились такие вопросы:

1) Почему,если написав new выделяется больше байтов в стэке и ячеек?
2) Как вообще здесь будет правильней? Использовать new или как раз этот static?
3) Если можно,объясните вообще про Header size,Code Size,Data Size,Stack. Я вообще как-то читал статью про это,но все равно особо не догоняю. Было бы не плохо объяснить по проще про эти дела..

За ранее большое спасибо!

VVWVV
19.02.2016, 16:44
У оператора static есть несколько свойств: во-первых, с помощью него вы можете произвести инкапсуляцию переменной, т.е. её область видимости будет только в одном файле; во-вторых, встраивая данную переменную в функцию, значение данной переменной не будет сброшено при повторном запуске функции, т.к. значение данной переменной попадает в сегмент данных.
В первом примере вы все равно занесли строку в сегмент данных, после чего, соответственно, измерили её. Вы можете и не использовать оператор static, и, конечно, вы лишитесь не только подсчитанного массива, но и производительности (не всегда).
Code Size – размер сегмента кода. В данном сегменте хранятся команды на языке машинных кодов.
Data Size – размер сегмента данных (статических). Статические переменные, которые инициализируются ещё до включения процесса в работу. Данные переменные существуют все время, и сегмент очищается только после выключения сервера.
Stack Size – размер сегмента стека. В данном сегменте хранятся локальные переменные, а также адреса возврата из функции.
Heap Size – размер сегмента кучи. С помощью данного сегмента вы можете выделить динамическую память.
Более детальную информацию вы можете почитать здесь (http://www.compuphase.com/pawn/Pawn_Implementer_Guide.pdf).




И получается,что мне от части выгоднее юзать static str[sizeof(msg)+113];, нежели new str[sizeof(msg)+113]; ? Или я не особо понял про эту информацию (имею в виду,инфу,что выводится при компиляции).

Если вы хотите всегда хранить значения в массиве, то да, но в данной ситуации этого не нужно.