memmove(3)の Linux マンページから
memmove() 関数は、メモリ領域 src からメモリ領域 dest に n バイトをコピーします。メモリ領域はオーバーラップする場合があります。コピーは、src 内のバイトが最初に src または dest とオーバーラップしない一時配列にコピーされ、次にバイトが一時配列から dest にコピーされるかのように行われます。
一時的な配列を割り当てて値を 2 回コピーする代わりに、次のようにすることができます。
void *my_memmove(void *dest, const void *src, size_t n) {
signed char operation;
size_t end;
size_t current;
if(dest != src) {
if(dest < src) {
operation = 1;
current = 0;
end = n;
} else {
operation = -1;
current = n - 1;
end = -1;
}
for( ; current != end; current += operation) {
*(((unsigned char*)dest) + current) = *(((unsigned char*)src) + current);
}
}
return dest;
}
この実装では、コピーを開始する位置を処理するだけです。
私の実装に欠点はありますか?
注: 実際には実装を使用しません。私はただ興味があります。