当前位置: 首页 > news >正文

Lua的table(表)

Lua表的基本概念

Lua中的表(table)是一种多功能数据结构,可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制,其他数据结构如数组、列表、队列等都可以通过表来实现。

表的实现

Lua的表由两部分组成:

  1. 数组部分:用于存储整数键值对,类似于数组。

  2. 哈希部分:用于存储非整数键值对,类似于字典。

内存分配 

 Lua表的内存分配是动态的,随着元素的增加或减少,表的大小会自动调整。以下是内存分配的关键点:

  1. 初始大小

    • 新创建的表初始时数组部分和哈希部分都为空。

    • 当插入第一个元素时,Lua会根据元素类型决定将其放入数组部分还是哈希部分。

  2. 动态调整

    • 数组部分:当数组部分元素数量超过当前容量时,Lua会重新分配更大的数组,通常容量会翻倍。

    • 哈希部分:当哈希部分的负载因子(元素数量与桶数量的比值)超过某个阈值时,Lua会重新分配更大的哈希表,通常容量也会翻倍。

  3. 重新哈希

    • 当表的大小发生变化时,Lua会进行重新哈希操作,将元素重新分配到新的数组或哈希部分。

内存管理

Lua使用垃圾回收机制来管理内存,表不再被引用时会被自动回收。你可以通过collectgarbage函数手动触发垃圾回收。

-- 手动触发垃圾回收
collectgarbage("collect")

表的构造

表示引用类型,当定义了table a,table b,在内存中就是a和b都指向同一个表,那么当b修改了表中的数据之后a表的值也会修改,当a和b都指向nil的时候,Lua发现没有指向这个表的变量,那么就会自动回收,下面是实例代码:

local a = { ['s'] = 1, 54, ['k'] = 2 }
local b = a
print(a['s'])
a['s'] = 3
print(b['s'])

table的for循环写法

从table结构体分析table属性

typedef struct Table {CommonHeader;lu_byte flags;  /* 1<<p means tagmethod(p) is not present */ lu_byte lsizenode;  /* 以2的lsizenode次方作为哈希表长度 */struct Table *metatable /* 元表 */;TValue *array;  /* 数组 */Node *node; /* 哈希表 */Node *lastfree;  /* 指向最后一个为闲置的链表空间 */GCObject *gclist;int sizearray;  /* 数组的大小 */
} Table;

1.

  • 作用:这是 Lua 中所有可垃圾回收对象的通用头部。

  • 内容

    • GCObject *next:指向下一个可垃圾回收对象,用于垃圾回收器的链表。

    • lu_byte tt:对象的类型标记(如 LUA_TTABLE 表示表)。

    • lu_byte marked:垃圾回收器的标记位,用于标记对象是否存活。

2.

  • 作用:标志位,用于存储表的元方法(metamethod)是否存在。

  • 细节

    • 每个标志位对应一个元方法(如 __index__newindex 等)。

    • 如果某一位为 1,表示对应的元方法不存在;为 0 则表示存在。

    • 例如,flags & (1 << p) 可以检查第 p 个元方法是否存在。

3.

  • 作用:表示哈希表的大小(以 2 的幂次方表示)。

  • 细节

    • 哈希表的实际大小为 2^lsizenode

    • 例如,lsizenode = 5 表示哈希表有 2^5 = 32 个桶。

    • Lua 使用幂次方大小是为了方便哈希表的扩容和缩容。

4.

  • 作用:指向表的元表(metatable)。

  • 细节

    • 元表是 Lua 中实现面向对象编程和操作符重载的核心机制。

    • 如果 metatable 为 NULL,表示表没有元表。

5.

  • 作用:指向数组部分的指针。

  • 细节

    • 数组部分用于存储整数键值对(从 1 开始的连续整数键)。

    • 每个元素是一个 TValue 结构,存储值和类型标记。

    • 如果 array 为 NULL,表示数组部分为空。

6.

  • 作用:指向哈希表的指针。

  • 细节

    • 哈希表用于存储非整数键值对(如字符串、浮点数等键)。

    • 每个桶是一个 Node 结构,包含键、值和类型标记。

    • 如果 node 为 NULL,表示哈希部分为空。

7.

  • 作用:指向哈希表中最后一个空闲的桶。

  • 细节

    • Lua 的哈希表使用开放寻址法(open addressing)解决冲突。

    • lastfree 用于快速找到空闲的桶,避免遍历整个哈希表。

8.

  • 作用:用于垃圾回收的链表。

  • 细节

    • Lua 的垃圾回收器使用链表管理所有可回收对象。

    • gclist 指向下一个需要垃圾回收的对象。

9.

  • 作用:表示数组部分的大小。

  • 细节

    • 数组部分的大小是动态调整的,随着元素的增加或减少而变化。

    • 例如,sizearray = 4 表示数组部分可以存储 4 个元素(键为 1 到 4)。

下面是table内部的抽象图:

相关文章:

Lua的table(表)

Lua表的基本概念 Lua中的表&#xff08;table&#xff09;是一种多功能数据结构&#xff0c;可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制&#xff0c;其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成&#xff1a; 数组部分…...

ZT36 小红和小紫的取素因子游戏

描述 小红和小紫拿到了一个正整数x&#xff0c;她们每次可以选择x的一个因子k(k>1)&#xff0c;把x除以k&#xff0c;但要求k必须是素数。小红先手&#xff0c;谁先不能操作谁输。假设两人都足够聪明&#xff0c;最终谁取得胜利&#xff1f; 共进行t次游戏。 输入描述&…...

C# 使用 Newtonsoft.Json 序列化和反序列化对象实例

Newtonsoft.Json&#xff08;也被称为 Json.NET&#xff09;是一个广泛使用的用于在 C# 中进行 JSON 序列化和反序列化的开源库。下面将详细介绍如何使用它来序列化和反序列化对象。 1. 安装 Newtonsoft.Json 如果你使用的是 Visual Studio&#xff0c;可以通过 NuGet 包管理…...

用 AI 工具提升 UX/UI 设计效率:从研究到原型

—————————————————— 用 AI 工具提升 UX/UI 设计效率&#xff1a;从研究到原型 开篇引言&#xff1a; 在 UX/UI 设计领域&#xff0c;效率与创意之间的平衡一直是设计师们追求的目标。随着 AI 工具的崛起&#xff0c;设计师们不仅能更快地完成任务&#xff0c…...

操作系统知识点12

1.在操作系统的结构设计中&#xff0c;采用层次结构的操作系统其最大优点是把整体问题局部化 2.非特权指令是指操作系统和用户均可以使用的指令 3.向处理器发出的中断信号称为中断请求 4.轮转法RR是单纯基于时间片考虑的 5.当进程处于就绪状态时&#xff0c;表示进程已获得…...

FASIONAD:自适应反馈的类人自动驾驶中快速和慢速思维融合系统

24年11月来自清华、早稻田大学、明尼苏达大学、多伦多大学、厦门大学马来西亚分校、电子科大&#xff08;成都&#xff09;、智平方科技和河南润泰数字科技的论文“FASIONAD : FAst and Slow FusION Thinking Systems for Human-Like Autonomous Driving with Adaptive Feedbac…...

Redis7——基础篇(八)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…...

nvm安装

1.下载安装包 从官网下载https://github.com/nvm-sh/nvm/releases 这里下的是nvm-0.40.1.tar.gz 2&#xff0e;解压 tar -zxvf nvm-0.40.1.tar.gz 3. 修改配置文件 vi ~/.bashrc 在最后一行添加如下内容 export NVM_DIR"/usr/local/nvm-0.40.1"[ -s "$NVM…...

基于vue框架的游戏博客网站设计iw282(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,博客信息,资源共享,游戏视频,游戏照片 开题报告内容 基于FlaskVue框架的游戏博客网站设计开题报告 一、项目背景与意义 随着互联网技术的飞速发展和游戏产业的不断壮大&#xff0c;游戏玩家对游戏资讯、攻略、评测等内容的需求日…...

spring MVC执行流程

详细的项目结构 src ├── main │ ├── java │ │ ├── com.example │ │ │ ├── config │ │ │ │ └── SpringMvcInitializer.java // 配置 DispatcherServlet │ │ │ │ └── SpringConfig.java // Sprin…...

递归遍历目录 和 普通文件的复制 [Java EE]

递归遍历目录 首先 先列出当前目录所包含的内容 File[] files currentDir.listFiles();if (files null || files.length 0) {// 若是空目录或非法目录, 则直接返回return;} 然后 遍历列出的文件, 分情况两种讨论 for (File f: files) {// 加个日志, 方便查看程序执行情…...

如何在docker上部署java服务

目录结构 首先 Dockerfile FROM bladex/alpine-java:openjdk17_cn_slimMAINTAINER admin@rsz.comENV TZ=Asia/ShanghaiRUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneRUN mkdir -p /xhWORKDIR /xhEXPOSE 8106ADD ./blade-system.…...

Machine Learning 初探

前置知识 pandas 读取文件&#xff1a;read_csv查看信息 describe&#xff1a;查看整体信息&#xff0c;包括每列的平均值、最大最小值、标准差等head&#xff1a;输出头部几行数据columns&#xff1a;输出所有列名loc&#xff1a;查询数据&#xff0c;或是根据索引取对应的数…...

GESP2024年12月认证C++三级( 第三部分编程题(1)数字替换)

参考程序&#xff1a; #include <iostream> #include <vector> #include <algorithm> using namespace std; int a[100010]; // 定义一个数组a&#xff0c;用于存储序列A&#xff0c;数组大小为100010 int main() {int n, k; // 定义变量n和k&#xff0c;…...

IDEA-插件开发踩坑记录-第六坑-UAST依赖问题

背景 简要说明&#xff1a; UAST – Unified Abstract Syntax Tree UAST (Unified Abstract Syntax Tree) is an abstraction layer on the PSI of different programming languages targeting the JVM (Java Virtual Machine). It provides a unified API for working with co…...

单片机总结【GPIO/TIM/IIC/SPI/UART】

一、GPIO 1、概念 通用输入输出口&#xff1b;开发者可以根据自己的需求将其配置为输入或输出模式&#xff0c;以实现与外部设备进行数据交互、控制外部设备等功能。简单来说&#xff0c;GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…...

信号和槽

connect(信号发送者&#xff0c;发送的信号&#xff0c;信号接收者&#xff0c;信号的处理); 信号函数和槽函数的参数必须是一样的&#xff0c;但信号的参数可以多余槽函数的参数&#xff08;前面的参数类型必须一致&#xff09; 是控件和控件间的信号传递&#xff0c;这两个…...

Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)

文章目录 Redis下载地址&#xff1a;一、zip压缩包方式下载安装 1、下载Redis压缩包2、解压到文件夹3、启动Redis服务4、打开Redis客户端进行连接5、使用一些基础操作来测试 二、msi安装包方式下载安装 1、下载Redis安装包2、进行安装3、进行配置4、启动服务5、测试能否正常工…...

1.2.3 使用Spring Initializr方式构建Spring Boot项目

本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目&#xff0c;并进行基本配置。首先&#xff0c;通过Spring Initializr生成项目骨架&#xff0c;然后创建控制器HelloController&#xff0c;定义处理GET请求的方法hello&#xff0c;返回HTML字符串。接着&#xf…...

数据可视化02-PCA降维

一、PCA PCA做什么&#xff1f;找坐标系。 目标&#xff1f;二维降到一维&#xff0c;信息保留最多。 怎么样最好&#xff1f;数据分布最分散的方向&#xff08;方差最大&#xff09;&#xff0c;作为主成分&#xff08;坐标轴&#xff09;。 二、怎么找主成分&#xff1f; …...

2026告别水印烦恼!免费图片去水印保姆级教程,从微信小程序到手机App一看就会

你是不是也遇到过这种抓狂的时刻&#xff1f;好不容易在小红书、抖音上看到一张绝美的壁纸、一个笑到岔气的表情包&#xff0c;兴致勃勃地保存下来&#xff0c;结果发现画面正中间或角落上&#xff0c;总趴着一个破坏美感的水印。想用来做PPT配图&#xff0c;水印太显眼&#x…...

工具调用失效?DeepSeek官方未公开的3个隐式约束条件,90%开发者至今仍在硬编码绕过

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;工具调用失效&#xff1f;DeepSeek官方未公开的3个隐式约束条件&#xff0c;90%开发者至今仍在硬编码绕过 DeepSeek-R1 模型虽开放了 tools 调用接口&#xff0c;但其底层推理引擎对工具参数存在三类未…...

中小团队如何统一管理多个项目的AI模型调用与API密钥

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 中小团队如何统一管理多个项目的AI模型调用与API密钥 在中小型技术团队的日常开发中&#xff0c;多个项目并行是常态。这些项目可能…...

从机器学习到生化电路:基于维度缩减与内部模型的趋势预测设计

1. 项目概述&#xff1a;当机器学习遇见生化电路在合成生物学和计算神经科学的交叉地带&#xff0c;有一个问题一直让我着迷&#xff1a;一个由简单化学反应构成的生物系统&#xff0c;如何能像一台精密的计算机一样&#xff0c;对未来做出预测&#xff1f;这听起来像是科幻小说…...

Frida高级脚本编写:绕过加固、动态定位混淆方法与Native层Hook

1. 这不是“装个插件就能跑”的教程&#xff0c;而是你真正要动手写脚本的起点很多人点开“Frida Objection 自动化安全测试”这类标题&#xff0c;心里想的是&#xff1a;下载个 Objection CLI&#xff0c;objection -g com.example.app explore一敲&#xff0c;再android ho…...

GIF动画处理工具Gifsicle:如何高效优化与管理动态图像资源

GIF动画处理工具Gifsicle&#xff1a;如何高效优化与管理动态图像资源 【免费下载链接】giflossy Merged into Gifsicle! 项目地址: https://gitcode.com/gh_mirrors/gi/giflossy Gifsicle是一个专为GIF动画处理而设计的命令行工具套件&#xff0c;它提供了完整的GIF文件…...

LLM与ML在NIDS规则映射MITRE ATTCK任务中的性能对比与实战指南

1. 项目概述&#xff1a;当AI遇见网络安全&#xff0c;一场关于“理解”与“分类”的较量在网络安全运营中心&#xff08;SOC&#xff09;里&#xff0c;分析师们每天都要面对海量的告警。每一条告警背后&#xff0c;都对应着网络入侵检测系统&#xff08;NIDS&#xff09;的一…...

d2dx深度探索:经典游戏《暗黑破坏神2》现代化适配的技术架构与实现原理

d2dx深度探索&#xff1a;经典游戏《暗黑破坏神2》现代化适配的技术架构与实现原理 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2d…...

DS4Windows:让PS4手柄在Windows电脑上焕发新生!5个超实用功能解锁游戏新境界

DS4Windows&#xff1a;让PS4手柄在Windows电脑上焕发新生&#xff01;5个超实用功能解锁游戏新境界 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 还在为PC游戏不支持PS4手柄而烦恼吗&a…...

Nmap零基础实战:从安装配置到渗透测试全流程解析

1. 别再被“零基础”三个字骗了&#xff1a;Nmap不是点开就用的玩具&#xff0c;而是你第一把真正能切开网络的手术刀很多人点开“渗透测试零基础入门”这类标题&#xff0c;心里想的是&#xff1a;“装个软件&#xff0c;敲几行命令&#xff0c;扫出一堆IP和端口&#xff0c;就…...