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

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±

    Инициализация массива

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


    Эксперимент, код:
    1. new str_test[10];
    2. printf("New:");
    3. for(new i; i < 10; i++)
    4. printf("%i", str_test[i]);
    5.  
    6. noinit:str_test_1[10];
    7. printf("Noinit:");
    8. for(new i; i < 10; i++)
    9. 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:? Это какие-то ссылки на ячейки памяти или что?

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


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

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от punkochel Посмотреть сообщение
    Откуда берутся различные цифры после Noinit:? Это какие-то ссылки на ячейки памяти или что?
    Это старые данные, которые хранились в этом блоке памяти ранее. Не просто же так обнуление делается при инициализации. А как раз чтоб точно отчистить память от старых данных.

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


    В таком случае можно будет забыть о ручной инициализации, или я не так что-то понимаю?
    Может быть если использовать %0[0] = 0;, то пока я получаю доступ к 0-ой ячейке массива, профит от noinit: пойдет на нет?
    Если ты не понимаешь для чего и когда стоит делать пропуск инициализации, то лучше вообще забудь об этом. Ты не выиграешь из-за этого пропуска какое-то ощутимое количество времени. Но если ты начнёшь пихать пропуск инициализации всюду бездумно, то уверен, что ты немало проблем из-за этого словишь. Либо пойми как работает память в Pawn (и сразу придёт понимание как работать с пропуском инициализации), либо забудь о пропуске инициализации.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. 2 пользователя(ей) сказали cпасибо:
    oukibt (01.07.2020) punkochel (30.06.2020)
  4. #3
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Если ты не понимаешь для чего и когда стоит делать пропуск инициализации, то лучше вообще забудь об этом. Ты не выиграешь из-за этого пропуска какое-то ощутимое количество времени. Но если ты начнёшь пихать пропуск инициализации всюду бездумно, то уверен, что ты немало проблем из-за этого словишь. Либо пойми как работает память в Pawn (и сразу придёт понимание как работать с пропуском инициализации), либо забудь о пропуске инициализации.
    Может быть не все моменты понимаю, но кое-что знаю. Так же уже встретился с проблемой которая последовала от не инициализированного массива. Если говорить совсем просто, то пропускать инициализацию стоит тогда, когда ты будешь сам это делать, то бишь та же функция format к примеру или strmid с 0 ячейки записи.
    Получается данные в массиве так остаются после записи в него информации.
    Если я не прав в чем-то, или что-то нужно еще знать при использовании данного макроса, будь добр - скажи.

  5. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Я лишь повторюсь, что не существует таких ситуаций, где этот макрос был бы жизненно необходим для работоспособности системы. Поэтому могу лишь посоветовать забыть о нём и не тратить своё время впустую. Лучше придумывай интересные системы и радуй игроков.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

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

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

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

Ваши права

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