代数数据类型的首选内存布局是什么?

时间:2016-05-24 15:22:24

标签: llvm algebraic-data-types

代数数据类型(ADT)是由单位,乘积和和类型组成的类型,可能有递归。

在Haskell中考虑一个简单的ADT:

data Tree = Empty
          | Leaf Int
          | Node Tree Tree

或者Rust中的另一个例子:

enum Message {
    Quit,
    ChangeColor(i32, i32, i32),
    Move { x: i32, y: i32 },
    Write(String),
}

Haskell(垃圾收集)和Rust(不是垃圾收集)如何在内存中实际代表这些内容,它们应该如何表示?

我主要对非垃圾收集案例感兴趣,这个案例比较简单,但如果非垃圾收集,解决方案必须对堆和堆栈都可行,就像Rust一样。

LLVM或C / C ++中的表示是我感兴趣的。

使用第二个例子,我可以想到两个选择:

选项1,使用工会:

enum MCtor { CQ, CCC, CM, CW  };

struct Message {
    enum MCtor ctor;
    union {
        void*; /* Quit */
        struct { int r; int g; int b; } /* ChangeColor */
        struct { int x; int y; } /* Move */
        struct { char* str; } /* Write */
    };
};

选项2,使用单独分配,void*和(位)强制转换:

enum MCtor { CQ, CCC, CM, CW  };

typedef struct { int r; int g; int b; } ChangeColor;
typedef struct { int x; int y; } Move;
typedef struct { char* str; } Write;

struct Message {
    enum MCtor ctor;
    void* data;
};

模式匹配只是switchmsg -> ctor的问题。

哪一个更可取,特别是考虑递归类型?

脱离我的头脑,我猜第一个的位置更好,它可以避免负载,而它可能会使用更多的内存...所以第二个选项有更好的内存占用但更差的性能.. ?

1 个答案:

答案 0 :(得分:1)

以下是一些资源,用于解释GHC如何实现数据结构: