技术问询:是否存在可在栈上分配的datatype版本?
首先得对齐下语境——你提到的datatype(堆分配非线性类型)和datavtype(堆分配线性类型),应该是指支持线性/非线性类型系统里的概念对吧?那关于栈上分配的对应版本,答案是存在的,具体要看你使用的语言,我给你梳理下常见的实现情况:
栈上的非线性类型版本:其实很多语言里的常规值类型就属于这类。比如在OCaml中,如果你定义一个普通的代数数据类型,只要它的构造子大小足够小、编译时能确定静态大小,默认就会在栈上分配,不需要额外关键字。举个例子:
type stack_allocated = Num of int | Flag of bool这个类型的实例默认会放在栈上,除非你把它塞进堆分配的结构(比如链表)里。这其实就是堆分配
datatype的栈版等价物——非线性、栈上存储。栈上的线性类型版本:对应
datavtype的栈分配版,现在不少语言通过所有权系统或者显式修饰符支持这类。比如Rust里,普通结构体默认是栈分配的,再配合Rust的所有权规则(天然的线性语义),就实现了栈上的线性类型。如果你需要更显式的线性约束,一些实验性语言(比如Cyclone)支持用linear修饰符定义栈上的线性数据类型。
这里要注意一个核心前提:栈分配的类型必须是静态大小可确定的。如果你的类型是可变长度(比如动态数组)或者需要动态扩展,那只能堆分配,没办法放到栈上。
另外,有些语言不会专门用datatype这类关键字区分栈/堆版本,而是靠类型的“值类型/引用类型”属性自动分配:值类型栈上存储,引用类型堆上存储。这种情况下,你定义的普通值类型代数数据类型就是栈上非线性类型,加上线性约束(比如所有权、线性类型修饰)就变成栈上线性类型。
内容的提问来源于stack exchange,提问作者antoyo

