C++实现实现memcpy、memmove函数.
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时,memcpy不保证拷贝结果的正确,而memmove能正确地实施拷贝,但这也增加了一点点开销。
memcpy的实现:
- 当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
- 当源内存的首地址不等于目标内存的首地址时,实行正向拷贝
memmove的实现:
- 当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
- 当源内存的首地址大于目标内存的首地址时,实行正向拷贝
- 当源内存的首地址小于目标内存的首地址时,实行反向拷贝
具体代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <string> #include <iostream>
using namespace std;
void* MyMemcpy (void * dst, const void * src, size_t count) {
if (count == 0) return dst; if (dst == nullptr || src == nullptr) return nullptr;
char* p_dst = (char*) dst; char* p_src = (char*) src;
while(count--) { *p_dst = *p_src; p_dst++; p_src++; } return dst;
}
void* MyMemmove (void * dst, const void * src, size_t count) {
if (count == 0) return dst; if (dst == nullptr || src == nullptr) return nullptr;
char* p_dst = (char*) dst; char* p_src = (char*) src;
if (p_dst <= p_src || p_src + count <= p_dst) { while(count--) { *p_dst = *p_src; p_dst++; p_src++; } } else { p_dst = p_dst + count - 1; p_src = p_src + count - 1; while (count--) { *p_src = *p_dst; p_src--; p_dst--; } } return dst; }
int main() { char buf[] = "abcdefg"; char str[] = "abcdefg";
MyMemcpy(str + 2, str, 4); cout << str << std::endl; MyMemmove(buf, buf + 2, 2); cout << buf << std::endl; return 0; }
|