Здравствуйте. Копался-копался, не нашёл ответа на свой вопрос о JASS, на самом деле, довольно интересный.
Статья ScorpioT1000 утверждает следующее о работе движка WarCraft III со строками (типом string):
Строка в Jass – это последовательность символов в кодировке UTF-8.
На самом деле всё немного сложнее. В памяти располагается так называемый string table – это хеш-таблица, которая содержит в себе все строки, когда-либо созданные в процессе игры. Таблица строк накапливает строки, но не удаляет их, даже если их больше не используют. Неиспользуемые строки удаляются лишь после загрузки сохранённой игры(или конца игры).
Когда мы генерируем какую-либо строку, её хеш-сумма сравнивается на объект дубликата. И если такой строки ещё не было в таблице строк – строка добавляется в эту таблицу, а ссылка типа string возвращается как результат операции. Если же строка уже была создана, то наша временная строка удаляется, а в качестве результата возвращается ссылка на уже существующую строку из таблицы.
Тип string обладает следующими операторами: присвоение(=), сравнение(==, !=) и конкатенация(+).
Операторы не работают с другими типами (например, integer в виде набора чаров), но для этого есть специальные функции конвертации типов в строку и обратно(подробнее в common.j). Так же существуют базовые функции подстроки (SubString), длины строки (StringLength) и другие.
Следует знать, что любые операции создают после себя новую ссылку на строку, поэтому не стоит ими злоупотреблять.
Отсюда вопрос. Как, собственно, с памятью работает функция S2I? I2S, как я понимаю, создаёт новую ссылку на строку. Что делает S2I? Обращается к существующей ссылке на строку, не создавая новой? Или всё-таки какая-то промежуточная ссылка имеется?
Заранее благодарю за ответ.
Singularity, 28.06.2017

Принятый ответ

S2I принимает строку в качестве параметра и никак её не изменяет
с чего вдруг он должен создавать новые строки?
I2S создаёт временную строку
если в таблице есть строка равная временной по хэшу то он возвращает строку из таблицы
если в таблице строки нету то он добавляет нашу временную строку в таблицу
т.е. обычный алгоритм хэширования
6
28
7 лет назад
6
S2I принимает строку в качестве параметра и никак её не изменяет
с чего вдруг он должен создавать новые строки?
I2S создаёт временную строку
если в таблице есть строка равная временной по хэшу то он возвращает строку из таблицы
если в таблице строки нету то он добавляет нашу временную строку в таблицу
т.е. обычный алгоритм хэширования
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.