我正在对 Scala 中的数组进行分析。我正在按照一本书(Robert W. Sebesta 的《编程语言概念》)进行此分析。根据这本书,有五类数组,基于绑定到下标范围、绑定到存储以及从哪里分配存储。类别是:
静态数组:下标范围是静态绑定的,存储分配是静态的(在运行时之前完成)。静态数组的优点是效率:不需要动态分配或释放。缺点是数组的存储在程序的整个执行时间内是固定的。
固定堆栈动态数组:是一种下标范围是静态绑定的,但分配是在执行期间的声明细化时完成的。固定堆栈动态数组相对于静态数组的优势在于空间效率。一个子程序中的大数组可以使用与不同子程序中的大数组相同的空间,只要两个子程序不同时处于活动状态。如果这两个阵列在不同的块中同时不活动,情况也是如此。缺点是需要分配和释放时间。
堆栈动态数组:是一种下标范围和存储分配在细化时动态绑定的数组。但是,一旦绑定了下标范围并分配了存储空间,它们在变量的生命周期内保持不变。堆栈动态数组相对于静态和固定堆栈动态数组的优势在于灵活性。在数组即将被使用之前,不需要知道数组的大小。
固定堆动态数组:类似于固定堆栈动态数组,在分配存储后,下标范围和存储绑定都是固定的。不同之处在于下标范围和存储绑定都是在用户程序在执行期间请求它们时完成的,并且存储是从堆而不是堆栈分配的。固定堆动态数组的优点是灵活性——数组的大小总是适合问题。缺点是堆的分配时间,比栈的分配时间长。
堆动态数组:下标范围和存储分配的绑定是动态的,并且可以在数组的生命周期内更改任意次数。堆动态数组相对于其他数组的优势在于灵活性:数组可以在程序执行期间随着空间需求的变化而增长和缩小。缺点是分配和释放时间较长,在程序执行过程中可能会发生多次。以下段落给出了这五个类别的示例。