是否存在“环形memcpy”?如何无循环实现环形数组带偏移复制
环形数组带偏移复制的高效实现方案
你要做的环形数组带偏移复制,不用写循环,靠两次memcpy就能搞定——memcpy是编译器优化过的底层函数,比手动遍历效率高得多。
先理清楚你的逻辑:把array1[index]放到array2[(offset+index)%SIZE],本质就是把array1拆成两段,分别复制到array2的后半段和前半段(偏移量不为0时)。
替代代码
#include <string.h> uint8_t array1[SIZE]; uint8_t array2[SIZE]; uint8_t offset = SOME_OFFSET; size_t len1 = SIZE - offset; // 复制array1前半段到array2的偏移起始位置 memcpy(array2 + offset, array1, len1); // 复制array1剩余部分到array2开头 memcpy(array2, array1 + len1, offset);
细节说明
- 如果
offset是0,len1等于SIZE,第二次memcpy长度为0,自动退化成普通整段复制,兼容边界情况。 - 非0偏移时,
array1被分成[0, len1)和[len1, SIZE)两部分,对应array2的[offset, SIZE)和[0, offset)区间,完全匹配环形偏移的需求。
这种方案没有手动循环,全靠标准库的优化实现,数组越大,性能优势越明显。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

