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

Llvm 代数数据类型的首选内存布局是什么?,llvm,algebraic-data-types,Llvm,Algebraic Data Types,代数数据类型(ADT)是由具有可能递归的单位、乘积和和和类型组成的类型 考虑Haskell中的一个简单ADT: 数据树=空 |叶Int |节点树 或者另一个生锈的例子: enum消息{ 退出 变色(i32,i32,i32), 移动{x:i32,y:i32}, 写(字符串), } Haskell(垃圾收集)和Rust(不是垃圾收集)在内存中实际是如何表示的,它们应该如何表示 我主要感兴趣的是非垃圾收集的情况,它比较简单,但是如果是非垃圾收集的话,解决方案必须对堆和堆栈都是可行的,比如生锈 我感

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

考虑Haskell中的一个简单ADT:

数据树=空
|叶Int
|节点树
或者另一个生锈的例子:

enum消息{
退出
变色(i32,i32,i32),
移动{x:i32,y:i32},
写(字符串),
}
Haskell(垃圾收集)和Rust(不是垃圾收集)在内存中实际是如何表示的,它们应该如何表示

我主要感兴趣的是非垃圾收集的情况,它比较简单,但是如果是非垃圾收集的话,解决方案必须对堆和堆栈都是可行的,比如生锈

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

使用第二个示例,我可以想到两个选项:

选项1,使用联合体:

enum MCtor{CQ,CCC,CM,CW};
结构消息{
枚举器;
联合{
作废*;/*退出*/
结构{intr;intg;intb;}/*ChangeColor*/
结构{int x;int y;}/*移动*/
结构{char*str;}/*Write*/
};
};
选项2,使用单独分配、
void*
和(位)强制转换:

enum MCtor{CQ,CCC,CM,CW};
typedef结构{intr;intg;intb;}ChangeColor;
typedef结构{intx;inty;}Move;
typedef结构{char*str;}Write;
结构消息{
枚举器;
作废*数据;
};
模式匹配只需打开
msg->ctor
,切换
即可

哪一个更好,特别是考虑到递归类型


不经意间,我猜第一个的位置更好,它避免了负载,同时可能会占用更多内存。。。因此,第二个选项的内存占用率更好,但性能更差…?

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

  • Johan Tibell在2015年苏黎世会议上的演讲(演讲从幻灯片42开始)

这可能会因为太宽而关闭。您会问哪个实现细节是最好的,但是变量太多了。您的目标机器体系结构是什么(缓存对齐和填充肯定会起作用)?您是否正在尝试优化速度或内存使用?我希望这也取决于将存储什么样的东西;语言中的所有内容都表示为指针吗?请注意,Rust不直接允许递归类型定义。如果是这样,结构的大小将是无限的。它要求您通过引用或堆分配的存储添加一层间接寻址。不确定C++是否允许匿名<代码>结构> /CONT/<代码>联合< /COD>成员。你的问题主要是基于观点的,而且太宽泛(挑一个)。任何一个都是一个有效的封闭原因。“奥拉夫,我已经知道,它们确实不允许在C++中。”CytILL:ADT不是一个元组,但是,它是一个联合:它是一个空,叶,或节点,而不是“全部”。只有节点是一个元组。很好,任何关于
rustc
的事情都可能会发生吗?让我现在成为一名Rust方面的专家:-)我意识到,如果返回,第二个选项实际上不可能在堆栈上使用,因为此时堆栈分配的数据字段将被释放。。。Rust分配给最大的变量,如我问题中的第一个选项,它通过以下方式演示:它产生
%Message=type{i8、[7 x i8]、[4 x i64]}