代数数据类型(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;
};
模式匹配只是switch
上msg -> ctor
的问题。
哪一个更可取,特别是考虑递归类型?
脱离我的头脑,我猜第一个的位置更好,它可以避免负载,而它可能会使用更多的内存...所以第二个选项有更好的内存占用但更差的性能.. ?
答案 0 :(得分:1)
以下是一些资源,用于解释GHC如何实现数据结构: