0

我需要一种尽可能有效的方法来转移数组的内容。我需要将每个数组位置的内容向右移动一个并忽略第一个,以便我可以在那里写入一个新值。

这是我所拥有的:

#define LENGTH 5

int myArray[LENGTH] = {1, 2, 3, 4, 5};

int *pa = myArray + (LENGTH - 1);

for (ushort i = 5; i > 0; i--) {
    *pa = *(pa - 1);
    pa--;
}

我想做的是将for循环的两行组合成一个操作。就像是:

*pa = *(pa--);

然而,这个结果是不确定的。我是否坚持我已经在使用的东西?

编辑:我应该澄清这不是我正在使用的实际代码,只是一个演示我所追求的构造的快速示例。

4

5 回答 5

6

如果你真的需要这样做,memmove它可能会是你最好的选择。

但是,如果可能的话,最好完全避免它。无需移动当前内容为新项目腾出空间,只需保留指向数组中“最旧”位置的指针即可。当您需要添加新项目时,请执行类似*new_pos++ = new_item;.

当您需要读取数据时,您将从new_pos+1接下来的 5 个项目开始并通读,但每次递增时都会这样做% LENGTH,因此当您到达数组的末尾时,它会“环绕”到开头.

于 2011-01-29T17:12:57.093 回答
5

效率不是以行数来衡量的,因此尝试以这种方式“压缩”代码不会有任何收获。

如果您删除最后一个元素,那么我的建议是使用循环缓冲区而不是数组,这样您就根本不需要这种转变。元素访问的价格会略有增加,但当 LENGTH 等于 2 的幂时,它会非常小。

于 2011-01-29T17:11:03.137 回答
0

memmove(3)

于 2011-01-29T17:12:43.157 回答
0
*pa = *(pa--);

然而,这个结果是不确定的。我是否坚持我已经在使用的东西?

是的。也不要让这打扰你。你的编译器很聪明。无论您是否在一两行上都有这个,它都会找到一种有效的方法。

如果您想做其他可能更优化的事情,请使用 memmove 而不是循环

memmove(&myArray[1],&myArray[0],(sizeof myArray - 1)*sizeof *myArray);
于 2011-01-29T17:12:45.747 回答
0

可能在整数数组中移动元素是一个好的优化器可以处理的事情。但是你确定你真的需要担心汇编指令吗?做了profile,发现问题出在哪里?

如果这是瓶颈,那么您可以在算法中更改某些内容……例如,为什么您需要进行这种转换?如果缓冲区是固定大小的,那么为什么不将其用作循环缓冲区呢?

于 2011-01-29T17:21:12.597 回答