Ссылка на строку

В моем коде мне нужно отслеживать определенное значение (строку, всегда...) в локальном файле. Я хотел бы знать, будет ли среда выполнения воссоздавать или проверять эту строку после помещения ее в локальную версию в официальных реализациях Lua 5.3. Любые идеи? В этом lua.org документе я, по крайней мере, слышал, что реализация Lua интернализирует строки (сохраняйте единственную копию любой строки).

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

local src = l[1]

-- `src` would hold a string

person Klaider    schedule 18.07.2017    source источник
comment
AFAIR PUC-Rio lua-5.3 больше не интерпретирует короткие строки. Кроме того, Lua 5.3 и LuaJIT — это две совершенно разные вещи.   -  person iehrlich    schedule 19.07.2017
comment
Кроме того, совершенно непонятно, чего вы пытаетесь достичь. Серьезно, не могли бы вы быть немного яснее, возможно, с дополнительным кодом, и что вы ожидаете от него?   -  person iehrlich    schedule 19.07.2017
comment
@iehrlich Извините, ну ... Я ожидаю, что этот код не будет дорогим во время выполнения, но мой вопрос в том, будет ли он копировать строку или нет внутри значения моего локального. Я ожидаю, что это будет прямо указывать на строку. Я думал также спросить об этом команду Lua (по электронной почте), но сомневаюсь, что получу быстрые ответы.   -  person Klaider    schedule 19.07.2017
comment
Ах хорошо, это хороший вопрос   -  person iehrlich    schedule 19.07.2017
comment
Поскольку строки в Lua неизменяемы, на каждую строку всегда будет только одна ссылка.   -  person Henri Menke    schedule 19.07.2017
comment
@HenriMenke Понятно. Я бы немного испугался, если бы Луа этого не сделал.   -  person Klaider    schedule 19.07.2017
comment
@iehrlich, Lua 5.3 делает короткие строки в Интернете.   -  person lhf    schedule 19.07.2017
comment
@lhf да, это так, просто взглянул на код. Хотя интересное решение.   -  person iehrlich    schedule 19.07.2017


Ответы (1)


Интернированы строки или нет, на самом деле это не проблема - интернирование строк - это просто механизм для ускорения сравнения строк и (возможно) сохранения некоторой памяти за счет ЦП, необходимого для создания строки.

Важен тот факт, что строки в lua обычно называются reference types. Это означает, что значения времени выполнения содержат и совместно используют только ссылки на строки, а присвоение строки значению времени выполнения — это просто копирование указателя и установка соответствующего тега для этого значения.

Еще одна вещь, которую делает ваш код, это то, что он позволяет вам избежать многократного поиска хэшей во время выполнения вашей функции. Например,

local a       = tbl['mykey']
-- ...
local other_a = tbl['mykey']

приведет к двум поискам хэша, в то время как

local cached_a = tbl['mykey']
-- ...
local a = cached_a
-- ...
local other_a = cached_a

уменьшит его до одного поиска. Но опять же, это обычно не имеет большого значения для целочисленных ключей. Но иногда даже целочисленные ключи вызывают поиск по хешу, даже если они маленькие. Кроме того, это зависит от реализации. Луа очень прост.

person iehrlich    schedule 18.07.2017
comment
Спасибо, xd, я также читал, что Lua использует массив для полей последовательности (1, 2, 3 и т. д.), и, кроме того, чтобы избежать проблем nil, я предопределяю некоторые из них, такие как local NULL = {}, NULLF = false. LuaJ (еще одна реализация на Java, используемая в TFM) также использует массивы, чтобы избежать хеширования. Хотя в LuaJIT используется оптимизация встроенного кэширования (другая реализация) - person Klaider; 19.07.2017
comment
Реализация таблиц @Matheus Array+hash является единственным жизнеспособным вариантом в соответствии со Стандартом. Единственное, что может отличаться, — это правило балансировки (решение о том, где заканчивается часть массива). Кроме того, возможно, что LuaJIT может устранить ряд последовательных обращений к одной и той же таблице с одним и тем же ключом, но это уже другая история. - person iehrlich; 19.07.2017