PDA

Просмотр полной версии : [Вопрос] Инициализация массива



punkochel
30.06.2020, 19:01
Прочитал интересный момент по инициализации массива, якобы при создании он заполняется нулями, следовательно тратит на это некоторое время.
Если использовать такой макрос, то можно избежать этой операции:
#define noinit:%0[%1]; goto _noinit_%0; new %0[%1]; _noinit_%0:

Эксперимент, код:

new str_test[10];
printf("New:");
for(new i; i < 10; i++)
printf("%i", str_test[i]);

noinit:str_test_1[10];
printf("Noinit:");
for(new i; i < 10; i++)
printf("%i", str_test_1[i]);

Результат:
New:
0
0
0
0
0
0
0
0
0
0

Noinit:
12243456
12243460
8
0
12211184
12898112
8
12881708
10
10

Откуда берутся различные цифры после Noinit:? Это какие-то ссылки на ячейки памяти или что?

Еще интересен момент, есть ли смысл изменить макрос таким способом?
#define noinit:%0[%1]; goto _noinit_%0; new %0[%1]; _noinit_%0: %0[0] = 0;

В таком случае можно будет забыть о ручной инициализации, или я не так что-то понимаю?
Может быть если использовать %0[0] = 0;, то пока я получаю доступ к 0-ой ячейке массива, профит от noinit: пойдет на нет?

DeimoS
30.06.2020, 21:02
Откуда берутся различные цифры после Noinit:? Это какие-то ссылки на ячейки памяти или что?

Это старые данные, которые хранились в этом блоке памяти ранее. Не просто же так обнуление делается при инициализации. А как раз чтоб точно отчистить память от старых данных.


Еще интересен момент, есть ли смысл изменить макрос таким способом?
#define noinit:%0[%1]; goto _noinit_%0; new %0[%1]; _noinit_%0: %0[0] = 0;

В таком случае можно будет забыть о ручной инициализации, или я не так что-то понимаю?
Может быть если использовать %0[0] = 0;, то пока я получаю доступ к 0-ой ячейке массива, профит от noinit: пойдет на нет?

Если ты не понимаешь для чего и когда стоит делать пропуск инициализации, то лучше вообще забудь об этом. Ты не выиграешь из-за этого пропуска какое-то ощутимое количество времени. Но если ты начнёшь пихать пропуск инициализации всюду бездумно, то уверен, что ты немало проблем из-за этого словишь. Либо пойми как работает память в Pawn (и сразу придёт понимание как работать с пропуском инициализации), либо забудь о пропуске инициализации.

punkochel
30.06.2020, 22:09
Если ты не понимаешь для чего и когда стоит делать пропуск инициализации, то лучше вообще забудь об этом. Ты не выиграешь из-за этого пропуска какое-то ощутимое количество времени. Но если ты начнёшь пихать пропуск инициализации всюду бездумно, то уверен, что ты немало проблем из-за этого словишь. Либо пойми как работает память в Pawn (и сразу придёт понимание как работать с пропуском инициализации), либо забудь о пропуске инициализации.

Может быть не все моменты понимаю, но кое-что знаю. Так же уже встретился с проблемой которая последовала от не инициализированного массива. Если говорить совсем просто, то пропускать инициализацию стоит тогда, когда ты будешь сам это делать, то бишь та же функция format к примеру или strmid с 0 ячейки записи.
Получается данные в массиве так остаются после записи в него информации.
Если я не прав в чем-то, или что-то нужно еще знать при использовании данного макроса, будь добр - скажи.

DeimoS
01.07.2020, 00:22
Я лишь повторюсь, что не существует таких ситуаций, где этот макрос был бы жизненно необходим для работоспособности системы. Поэтому могу лишь посоветовать забыть о нём и не тратить своё время впустую. Лучше придумывай интересные системы и радуй игроков.