C语言中的联合解引用和减量

C语言中的联合解引用和减量,c,pointers,performance,dereference,decrement,C,Pointers,Performance,Dereference,Decrement,我需要一种尽可能有效的方法来移动数组的内容。我需要将每个数组位置的内容向右移动一个位置,忽略第一个位置,以便在那里写入一个新值 以下是我所拥有的: #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循环的两

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

以下是我所拥有的:

#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--);
然而,其结果尚未确定。我是否被我已经使用的东西卡住了


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

效率不是以行数来衡量的,因此以这种方式“压缩”代码不会带来任何好处

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

然而,其结果尚未确定。我是否被我已经使用的东西卡住了

对。也不要让这件事困扰你。你的编译器很聪明。不管你是在一行还是两行上都能找到一个有效的方法

如果您想做一些可能更具选择性的事情,请使用memmove而不是循环

memmove(&myArray[1],&myArray[0],(sizeof myArray - 1)*sizeof *myArray);

如果您确实需要这样做,
memmove
可能是您的最佳选择

然而,如果可能的话,你最好完全避免。与其移动当前内容为新项目腾出空间,只需保留指向数组中“最旧”位置的指针即可。当您需要添加新项目时,执行类似于
*new\u pos++=new\u item的操作


当您需要读取数据时,您将从
new_pos+1
开始,并通读接下来的5项,但每次递增时,您将执行
%LENGTH
,因此当您到达数组末尾时,它将“环绕”一开始。

可能一个好的优化器可以处理整数数组中的元素移位。但是你确定你真的需要担心汇编指令吗?做了个人资料并发现问题存在吗


如果这是瓶颈,你可以在算法中改变一些东西。。。例如,您为什么需要进行这种转换?如果缓冲区是固定大小的,为什么不将其用作循环缓冲区?

您分析过它吗?我真的怀疑这是你代码中的瓶颈。你担心效率?(1) 如果这是一个瓶颈,甚至需要很长的时间,我会吃我的头。(2) 你是否意识到,行数越少并不意味着性能越高,也就是说,你的第二个版本与第二个版本在引擎盖下做的工作相同?第二段+1,如果可以的话+10。对
memmove
或同等产品的需求几乎总是表明存在严重的设计缺陷。
memmove(&myArray[1],&myArray[0],(sizeof myArray - 1)*sizeof *myArray);