lua 源码阅读(二)

2017-12-16 13:41

lua 源码系列文章:

读完风云关于 lua 的字符串部分,对 lua 的字符串处理也有相应的理解。

Contents

String#

lua 的字符串在 lua 内部分为长字符串和短字符串,而这两种特性在 lua 层面是透明的,这种分类应该只是lua 解释器内部的优化。

长短字符串主要在字符串创建、比较时做不同的处理。

字符串创建时,短字符串直接进行内部化,并且在 TString 结构体中的 extra 位上标记是否为内部保留字段。而长字符串在创建时,是直接进行内存拷贝,在 extra 位上进行标记,以在比较或者内部化时进行惰性哈希。

字符串比较时,短字符串直接对比指针地址。而长字符串则进行逐字符串比较。

userdata#

在 lua 中还存在一种 UData 的结构,这叫做 userdata,这种数据结构主要是在 lua 在与 c 和 c++ 交互时,将 c 的数据结构交给 lua 的 gc 处理。
具体来讲,在C中可以使用 lua_newuserdata() 会在 lua 中创建一个数据结构,并将指针返回。这和 malloc 的调用差不多,但区别是你不用手动调用 free 来释放内存,而交给 lua 的 gc 即可。
一个好的例子是 lua 的 io 库,其中将 FILE * 的 C 数据结构放入 lua 的 userdata 中,通过实现一个 __gc 的元方法,可以实现将文件句柄在 gc 时自动关闭。

https://github.com/xiaocang/lua-5.2.2_with_comments/releases/tag/lua_string_02


标签:lua

点击加载Disqus评论
Creative Commons © 2013 — 2018 xiao_cang | Theme based on fzheng.me & NexT | Hosted by Netlify