编程语言中对象的两种主要实现方法解析
经过对CPython、YARV(Ruby的官方虚拟机)以及不少小型编程语言底层实现的研究,我发现这类语言在对象内存模型上主要有两种主流实现方案。几乎所有这类实现都会先定义一个枚举类型来标记对象的具体类型,示例代码如下:
enum ObjectType { OBJECT_INT, OBJECT_FLOAT, OBJECT_STRING // 其他对象类型,比如列表、字典、函数等 };
接下来就是两种核心实现方式:
方式1:为每种对象类型定义独立的结构体
这种方案中,每种类型的对象都有自己专属的结构体定义。通常每个结构体的第一个成员都是上面定义的ObjectType枚举,这样在运行时可以快速判断对象类型,再通过类型转换访问结构体的具体字段。
举个实际的代码例子:
// 整数对象结构体 typedef struct { enum ObjectType type; int value; } IntObject; // 字符串对象结构体 typedef struct { enum ObjectType type; char* chars; int length; } StringObject; // 浮点数对象结构体 typedef struct { enum ObjectType type; double value; } FloatObject;
这种方式的优缺点
- 优点:
- 内存效率高:每个对象只包含自身类型必需的字段,没有冗余空间浪费
- 访问性能好:直接通过结构体指针访问字段,不需要额外的间接寻址
- 缺点:
- 代码冗余度高:处理任意对象时,必须先做类型判断,再转换成对应结构体指针,这类重复代码会很多
- 扩展性较差:新增一种对象类型时,需要修改多处类型检查和处理的逻辑
方式2:使用通用对象结构体+联合体(或变体类型)
这是另一种常见的实现方式,它会先定义一个通用的Object结构体,里面包含类型标记和一个联合体(union),联合体中存放不同类型对象的具体数据。
示例代码如下:
typedef struct { enum ObjectType type; union { int int_value; double float_value; struct { char* chars; int length; } string_value; // 其他类型的字段定义 } data; } Object;
这种方式的优缺点
- 优点:
- 代码更简洁:所有对象都统一用
Object类型表示,不需要频繁的类型转换 - 扩展性更好:新增类型时只需要在枚举和联合体中添加对应的字段即可,不需要大面积修改现有逻辑
- 代码更简洁:所有对象都统一用
- 缺点:
- 内存有冗余:联合体的大小由最大的成员决定,所以小类型的对象(比如整数)会占用更多内存
- 访问字段时需要先判断类型,虽然代码上统一,但底层还是有类型检查的开销
内容的提问来源于stack exchange,提问作者dangee1705
相关产品推荐
相关产品推荐

