// // Created by yudw on 2017/8/6. // #pragma once #include <iostream> #define debug_ namespace yudw { // 注意当内存有重叠时,src部分会被覆盖 void* memcpy(void *dst, const void* src, size_t size) { if(dst == nullptr || src == nullptr) { return nullptr; } char *pdst = static_cast<char*>(dst); const char *psrc = static_cast<const char*>(src); // 1.内存无重叠 // [dst + 0, dst + size -1] , [src + 0, src + size -1], [dst + 0, dst + size -1] if(pdst + size <= src || pdst >= psrc + size) { #ifdef debug_ std::cout<<"no cover:"; #endif while(size--) { *pdst++ = *psrc++; } } else // 2.内存有重叠 { if(pdst < psrc) // 2.1 dst 在左,有部分重叠,从前往后直接拷贝就行 { #ifdef debug_ std::cout<<"left cover:"; #endif while(size--) { *pdst++ = *psrc++; } } else // 2.2 dst 在右侧, 有部分重叠,从后向前拷贝,src重复部分会被dst覆盖 { #ifdef debug_ std::cout<<"right cover:"; #endif while(size--) { *(pdst + size) = *(psrc + size); } } } return dst; } }
memcpy
最新推荐文章于 2024-07-29 05:15:00 发布