为什么阵列不可扩展?

2022-09-02 19:22:44

当我们创建数组时,我们无法更改其大小;它是固定的。好吧,看起来不错,我们可以创建一个新的更大的数组,然后逐个复制值,这有点慢。它的技术背景是什么?


答案 1

这个问题没有提到语言,所以我将选择基于“C”的数组作为我的答案。

数组被分配为单个内存块。扩展数组是有问题的,因为正确执行该数组的唯一方法是在最后扩展它。对于大小 N 的增长,在下一个分配的地址之前,数组末尾必须至少有 N 个可用字节。

支持这种类型的分配需要将分配分散到虚拟地址空间中。这既消除了内存分配彼此更近的好处,又增加了碎片化。这与大多数试图将内存打包在一起并减少碎片的内存管理器背道而驰。

在内存中具有足够空间的位置分配新数组并复制数组,作为一般解决方案,根本无法选择。原因是数组的先前位置通过指针对使用者可见。

int* array = malloc(int*someSize);
int* pointer1 = &(arr[2]);
growArray(&array, 12);  // Can't move because pointer1 knows the address of the array

答案 2

其根部的数组是连续的内存“数组”。其他数据可以占用此内存区域之前和之后的数据,因此如果不分配适合新的较大大小的新的不同内存区域,则无法动态调整其大小。