Từ manpage Linux cho memmove(3)Tại sao Linux memmove() thực hiện theo cách của nó?
Các memmove() bản sao chức năng n byte từ vùng nhớ src đến khu vực bộ nhớ dest. Khu vực bộ nhớ có thể trùng lặp: sao chép diễn ra như thể các byte trong src là được sao chép lần đầu vào một mảng tạm thời không trùng lặp src hoặc dest và sau đó được sao chép từ mảng tạm thời đến đích.
Thay vì phân bổ một mảng tạm thời và sao chép các giá trị gấp đôi chúng ta chỉ có thể làm như sau:
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;
}
Thực hiện điều này, chúng tôi chỉ đơn giản là chăm sóc các vị trí mà chúng ta bắt đầu sao chép.
Có hạn chế trong việc triển khai của tôi không?
Lưu ý: Tôi sẽ không thực sự sử dụng triển khai của mình. Tôi chỉ tò mò thôi.
'dest
Tôi nghĩ bạn đã bỏ lỡ "như thể" trong manpage. Nó không thực sự hoạt động theo cách đó. – dbrank0
Bạn có thể so sánh việc triển khai của mình với [bcopy' của FreeBSD] (http://fxr.watson.org/fxr/source/string/bcopy.c?v=FREEBSD-LIBC), mã cơ bản cho memmove() của chúng. Nó cũng hỗ trợ sao chép ngược, không có bộ đệm tạm thời. – ShiDoiSi