我有一个简单(可能)的问题要问你。在C语言中创建自己的动态数组实现时,当数组接近其当前最大容量时,是提前分配内存(假设为10个元素),还是每次元素数量发生更改时重新分配内存更好?
我的意思是:对于性能、优雅或任何你想到的东西。
我有一个简单(可能)的问题要问你。在C语言中创建自己的动态数组实现时,当数组接近其当前最大容量时,是提前分配内存(假设为10个元素),还是每次元素数量发生更改时重新分配内存更好?
我的意思是:对于性能、优雅或任何你想到的东西。
通常的选择是将当前大小乘以一个大于1的固定数字(一般为1.5或2),这样可以得到摊销O(n)的总分配和复制成本。
请注意,并没有保证您可以原地增加数组的大小,因此您可能需要将所有现有元素复制到新位置(realloc()
会自动为您执行此操作,但您仍然需要付出代价)。
为了提高性能,尽可能少地使用 realloc 是更好的选择。所以你可以这样做:
array = realloc(array, old_size * 2);
/** Dynamic array */
typedef struct __darray {
int* array; /** Array */
int size; /** Array size */
int cap; /** Capacity */
} darray;
Size <= capacity .
当您动态添加新元素时,请测试您的大小是否 > 容量。 如果为真,则执行内存重新分配。 公式(取自 JDK 的 ArrayList 实现)如下:
(jobs here...)
[your_darray]->capacity+=[your_darray]->capacity*3/2+1;
[your_darray]->array=(int*)realloc([your_darray]->array,capacity*sizeof(int));
(jobs here...)
在堆上分配内存总是很昂贵的。逐个元素地执行这个操作是不可取的。
realloc
可能会失败!你需要检查这一点。 - rlbondif (old_size > SIZE_MAX / 2) { handle_error(); }
- caf