C++
1. 实现memcpy, strcpy
如果目标地址大于源地址,先拷贝高位源地址;
如果目标地址小于源地址,先拷贝低位源地址。
1 void mymemcpy(void* dst, const void* src, size_t num) { 2 assert(src != NULL && dst != NULL); 3 const char* psrc = (const char*)src; 4 char* pdst = (char*) dst; 5 if (pdst > psrc && pdst < psrc + num) { 6 psrc = psrc + num - 1; 7 pdst = pdst + num - 1; 8 while (num--) 9 *pdst-- = *psrc--; 10 } 11 } else { 12 while (num--) { 13 *pdst++ = *psrc++; 14 } 15 } 16 } 17 18 /* 19 易错点: 20 1. 函数接口:用void*比较通用一些;而且,src要加上const。 21 2. 判空是个很重要的考察点!这里用assert实现; 22 3. 下面对指针从void*转换到char* 和const char*; 23 4. 如果对size_t进行操作时一定要注意,size_t是unsigned,它降到0之后再减一就变成INT_MAX了,可不是-1! 24 */
follow up:如何优化?
默认的memcpy是逐字节拷贝; 优化方法是,不用一个字节一个字节的拷贝; 可以多字节拷贝,或者整块的拷贝,也可以是用int指针拷贝(一个int占4字节)。 如果用int指针拷贝,需要分别计算一下 wordNum = num / 4; slice = num % 4;
拓展:strcpy等一系列经典函数实现 ref ref2 ref3 ref4
除了memcpy外,其他函数在实现时可以不用考虑内存覆盖问题。具体可以和interviewer沟通。
1 char* strcpy(char* dst, const char* src) { 2 assert(dst != NULL && src != NULL); 3 char* pdst = dst; 4 const char* psrc = src; 5 while (*psrc != '