You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编程语言中对象的两种主要实现方法解析

经过对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:22:56