Gar*_*ies 0 c performance pointers 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--;
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是将for循环的两行组合成一个操作.就像是:
*pa = *(pa--);
Run Code Online (Sandbox Code Playgroud)
但是,结果是未定义的.我坚持使用我已经使用的东西吗?
编辑:我应该澄清这不是我正在使用的实际代码,只是一个快速的例子来演示我所追求的构造.
如果你真的需要这样做,memmove可能会是你最好的选择.
但是,如果可能的话,最好完全避开它.不要移动当前内容以为新项目腾出空间,只需保持指向数组中"最旧"点的指针.当您需要添加新项目时,请执行类似的操作*new_pos++ = new_item;.
当你需要阅读你的数据时,你将从new_pos+1接下来的5个项目开始阅读,但每次增加你都会这样做% LENGTH,所以当你到达数组的末尾时,它会"绕回"到开头.
效率不是以行数来衡量的,因此您不会通过尝试以这种方式"压缩"代码来获得任何收益.
如果你删除最后一个元素,那么我的建议是使用循环缓冲区而不是数组,这样你根本不需要这个转换.元素访问的价格会略有增加,但是当LENGTH等于2的幂时,它将非常小.