在C语言中,移动数组的最佳方法是什么?

9
我有一个数组,保存了一系列历史数值。当我添加新数值时,需要将之前所有数值左移一位,以舍弃最旧的数值并为下一个数值腾出空间。
我可以想到两种方法来实现这个过程,一种是使用memmove函数:
memmove(&arr[0], &arr[1], sizeof(arr) - sizeof(*arr));

或通过交换指针:

for (i = 0; i != sizeof(arr) - 1; i++) {
   *(arr + i) = *(arr + i + 1);
}

这两种方法之间是否存在性能差异,如果没有,哪种方法会被建议使用?

1
你有没有考虑过不使用数组来解决这个问题,或者这不是一个选项? - nic
1
@nic 我需要追踪最后X个数值,所以我想不到更合逻辑的存储方式,除了使用一个数组。 - Maestro
使用队列(仍然可以使用数组来实现),避免内存复制。http://www.thelearningpoint.net/computer-science/data-structures-queues--with-c-program-source-code - Jacob G
或者使用循环缓冲区(保持一个 int head 索引并进行所有访问 % arraySize)。 - chrylis -cautiouslyoptimistic-
@nic 这是针对数字滤波器的。每当我添加一个新点时,我需要计算所有先前点的总和,因此访问次数与插入次数相等。 - Maestro
显示剩余2条评论
4个回答

8
有一个更快的选择:
一个循环缓冲区,其中插入、删除和读取都是O(1)的。

3

它们的时间复杂度都相同。其他性能上的差异可能是由于特定情况,例如CPU,编译器,memmove的实现方式以及数组的大小等,因此你需要实际测量每种方法的性能并确定哪种更好。


1
阅读汇编输出也可能是有益的。 - chrylis -cautiouslyoptimistic-

1

我认为使用数组不是解决这个问题的最佳方式,尝试使用链表,你就不会遇到这个问题。


0

你可以使用作为链表或数组实现的FIFO队列。根据你的描述,这是最直接的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接