erlang数据类型的c源码解析(3)-tuple

1、前言

erlang数据类型的c源码解析(1)-Eterm讲到,当Eterm的低2位为10B时,为Boxed(装箱)类型。tuple是Boxed类型中的一种。

低2位外的位数用来表示一个指向arityval的指针。

arityval的定义如下如下:

// _TAG_PRIMARY_SIZE = 2
// 主标签占2位,子标签占4位,所以arityval的低6位是000000B
#define ARITYVAL_SUBTAG	 (0x0 << _TAG_PRIMARY_SIZE) /* TUPLE */

为arityval是一块连续内存空间,可以当作是C语言的数组,且数组首部元素为数组的长度。

结构如下图:
在这里插入图片描述

(图片来源:https://blog.edfine.io/blog/2016/06/28/erlang-data-representation/ , 侵删)

2、宏定义(erl_term.h)

// make_tuple最终会调用到_unchecked_make_boxed,其实就是将Eterm低2位设成10B
#define make_tuple(x)	make_boxed((x))

#define _unchecked_make_boxed(x) ((Uint) COMPRESS_POINTER(x) + TAG_PRIMARY_BOXED)
_ET_DECLARE_CHECKED(Eterm,make_boxed,Eterm*)
#define make_boxed(x)		_ET_APPLY(make_boxed,(x))

// _TAG_HEADER_ARITYVAL = 0
// make_arityval实质上是将sz左移6位,保证低6位为000000B
// 使其满足PrimaryTag为HEADER,SubTag为ARITYVAL
#define make_arityval(sz)	_make_header((sz),_TAG_HEADER_ARITYVAL)

#define _make_header(sz,tag)  ((Uint)(((sz) << _HEADER_ARITY_OFFS) + (tag)))

#define _HEADER_ARITY_OFFS	6

3、代码解析

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值