我知道Ruby数组都是动态分配和动态调整大小的; 但是,我似乎无法找到关于它们是否是真正数组的任何明确信息; 即它们在内存中是连续的(更具体地说,它们所持有的引用在内存中是连续的).
我的假设是增加Ruby数组的大小需要将整个数组重新分配到更大的连续内存块(如果需要).
这是正确的,还是"阵列"在这种情况下用词不当?
Ruby 语言规范没有规定Array
对象(或实际上任何对象)的任何特定内存表示。这对于实施者来说限制太大。事实上,它甚至没有规定对象必须存在于内存中,这使得像 MagLev 这样的实现成为可能,其中对象内存是分布式磁盘上的 OO 数据库而不是 RAM。
Ruby 语言规范也没有为该类的任何方法规定任何特定的性能特征Array
。
然而,Ruby 程序员已经开始期望某些Array
方法能够提供某些性能保证(任何不满足这些保证的实现都将被社区忽略),例如
Array#[]
最坏情况的步骤复杂度应为 O(切片的项目数)Array#<<
最坏情况步骤复杂度应为 O(n),摊销最坏情况步骤复杂度为 O(1)基本上,典型的性能保证了您对动态阵列的期望。
\n\n这或多或少意味着满足这些性能保证的唯一方法是实现必须使用连续存储和指数调整大小。
\n