lua.5.2.3源码阅读(02):字符串对象

lua中的字符串是对象,主要分析一下对象的结构和申请的方式。

TString是一个union,为了进行字节对齐,中间插入了L_Umaxalign,按照union的定义

union的大小,必须是单个结构大小的整数倍,按照目前的定义,应该是double大小的整数倍。

 1 /* type to ensure maximum alignment */
 2 #if !defined(LUAI_USER_ALIGNMENT_T)
 3 #define LUAI_USER_ALIGNMENT_T    union { double u; void *s; long l; }
 4 #endif
 5
 6 typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
 7
 8 /*
 9 ** Header for string value; string bytes follow the end of this structure
10 */
11 typedef union TString {
12   L_Umaxalign dummy;  /* ensures maximum alignment for strings */
13   struct {
14     CommonHeader;
15     lu_byte extra;  /* reserved words for short strings; "has hash" for longs */
16     unsigned int hash;
17     size_t len;  /* number of characters in string */
18   } tsv;
19 } TString;
20
21 /*
22 ** Common Header for all collectable objects (in macro form, to be
23 ** included in other objects)
24 */
25 #define CommonHeader    GCObject *next; lu_byte tt; lu_byte marked

展开上述定义,实际TString的关键定义:

1   struct {
2     GCObject *next;
3     lu_byte tt;
4     lu_byte marked;
5     lu_byte extra;  /* reserved words for short strings; "has hash" for longs */
6     unsigned int hash;
7     size_t len;  /* number of characters in string */
8   } tsv;

tt用于表示GC对象的类型,marked用于GC收集的时候的类型,后续再分析,extra标记是否为lua的保留字符串,hash为短字符串的哈希值,len为字符串的长度。

时间: 2024-12-05 13:38:04

lua.5.2.3源码阅读(02):字符串对象的相关文章

redis源码阅读——动态字符串sds

redis中动态字符串sds相关的文件为:sds.h与sds.c 一.数据结构 redis中定义了自己的数据类型"sds",用于描述 char*,与一些数据结构 1 typedef char *sds; 2 3 /* Note: sdshdr5 is never used, we just access the flags byte directly. 4 * However is here to document the layout of type 5 SDS strings. *

lua.5.2.3源码阅读(03):通用变量

lua的堆栈中存放的是通用变量,通用变量实际上就是一个union内存块,根据不同的类型,采用不同的组织方式, 看一下通用类型的相关定义,截取了lobject.h相关代码,从代码上看,不太清楚numfield为什么会有两个相关定义. 堆栈中可以根据情况分为一下几种类型: 1.双精度浮点数:double d__; 2.复合类型,通过tt__来表示类型: 3.复合类型中分为两种:可回收类型和不可回收类型: 4.可回收类型可以是:TString.Udata.Closure.Table.Proto.UpV

lua.5.2.3源码阅读(01):文件读取相关

Lua在载入lua文件的时候,读取过程中通过cache的方式,默认cache为512字节: 1.cache中包含数据时,直接将cache中数据返回: 2.cache中不包含数据的时候,每次读取512个字节,进行cache: 1 typedef struct LoadF { 2 int n; /* number of pre-read characters */ 3 FILE *f; /* file being read */ 4 char buff[LUAL_BUFFERSIZE]; /* ar

lua.5.2.3源码阅读(04):Table结构基本操作

table(lobject.h)的结构定义: 1 // TKey结构是一个链表结构,用来存储hash相同 2 // 的所有key,value对结构. 3 typedef union TKey { 4 struct { 5 TValuefields; // key值 6 struct Node *next; // 指向像一个相同hash值的key值: 7 } nk; 8 TValue tvk; //尾部的key值: 9 } TKey; 10 11 // (key,value)对结构,通过key计算

Redis源码阅读-sds字符串源码阅读

redis使用sds代替char *字符串, 其定义如下: typedef char *sds; struct sdshdr { unsigned int len; unsigned int free; char buf[]; }; sds指向了char 字符串 sdshdr是字符串头 结构比较巧妙 使用char buf[]存放字符串实际内容 注意char *buf和char buf[]是不同的 sizeof(sdshdr)等于8,而不是我以为的12 连续内存结构如下: 0----7 sdshd

redis源码阅读之集合对象

redis当中集合对象的底层实现为intset和hashtable实现,用hashtable实现时,存储具体值的是key,value统一用NULL.其实集合对象的实现和hash对象的实现还是非常类似的,都是尽可能用占用空间小的底层类型存储,如果实在存不下了,就得鸟枪换炮了老规矩,还是先说转换的条件,由于占地较小的实现为intset,这就导致发生转化的条件比zipmap->hashtable要不一样了,但也是一共两项,若有一项或一项以上没法满足,则intset转为hashtable: 集合对象均为

Hive cli源码阅读和梳理

对Cli的重新认识*). hive cli有两种模式, 本地模式: 采用持有的driver对象来处理, 远程模式: 通过连接HiveServer来实现, 由此可见之前的架构图中的描述还是模糊且带有误导性*). 支持singal的处理支持, 比如对ctrl+c中断, 需要两次才完全退出交互*). 交互式命令处理模式源码阅读*). Signal类对象的使用,Singal静态函数 Signal.handle(Singal singla, SingalHandler handler);对signal函数

《java.util.concurrent 包源码阅读》02 关于java.util.concurrent.atomic包

Aomic数据类型有四种类型:AomicBoolean, AomicInteger, AomicLong, 和AomicReferrence(针对Object的)以及它们的数组类型, 还有一个特殊的AomicStampedReferrence,它不是AomicReferrence的子类,而是利用AomicReferrence实现的一个储存引用和Integer组的扩展类 首先,所有原子操作都是依赖于sun.misc.Unsafe这个类,这个类底层是由C++实现的,利用指针来实现数据操作 关于CAS

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index