3

在我的代码中,我需要在本地跟踪某些值(字符串,总是......)。我想知道在官方 Lua 5.3 实现中将其放入本地后,运行时是否会重新创建或检查此字符串。有任何想法吗?在这个 lua.org文档中,我至少听说过 Lua 实现会进行字符串内部化(保留任何字符串的单个副本)。

我正在重新启动我的代码,所以到目前为止我做了一些微不足道的事情。我可以为每个函数做的一个例子是:

local src = l[1]

-- `src` would hold a string
4

1 回答 1

3

如果字符串被实习,实际上并不是一个问题 - 字符串实习只是一种加速字符串比较的机制,并且(可能)以牺牲创建字符串所需的 CPU 为代价节省一些内存。

重要的是 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

将其减少为一次查找。但是再一次,这对于整数键来说通常不是什么大问题。但有时即使是整数键也会触发哈希查找,即使它们很小。此外,它依赖于实现。Lua 非常简单。

于 2017-07-18T23:26:23.723 回答