memcpy、strcpy、memmove

問題一:函數區別

memcpy與memmove都是對內存進行拷貝可以拷貝任何內容,而strcpy僅是對字符串進行操作。

memcpy與memmove拷貝多少是通過其第三個參數進行控制而strcpy是當拷貝至'\0'停止。

memmove函數的功能同memcpy基本一致,但是當src區域和dst內存區域重疊時,memcpy可能會出現錯誤,而memmove能正確進行拷貝。

 

問題二:memcpy效率

https://aigo.iteye.com/blog/2299702

https://blog.csdn.net/z2007b/article/details/6559457

待分析。

 

問題三:memcpy實現

實現memcpy:

實現一:

void *memcpy(void *dest, const void *src, size_t count)
{
	assert(src != NULL && dest != NULL);
	char *tmp = dest;
	const char *s = src;
 
	while (count--)
	*tmp++ = *s++ ;
  
	return dest;
}

實現二:

void * memcpy(void *dst,const void *src,size_t num)
{
	assert(src != NULL && dest != NULL);
	int nchunks = num/sizeof(dst);   /*按CPU位寬拷貝*/
	int slice =   num%sizeof(dst);   /*剩餘的按字節拷貝*/
	
	unsigned long * s = (unsigned long *)src;
	unsigned long * d = (unsigned long *)dst;
	
	while(nchunks--)
	    *d++ = *s++;
	    
	while (slice--)
	    *((char *)d++) =*((char *)s++);
	    
	return dst;
}

實現三(如果內存有重疊):

void *memcpy(void *dest, const void *src, size_t count)
{
	assert(src != NULL && dest != NULL);
	char *d;
	const char *s;
 
	if (dest > (src+size)) || (dest < src))
	{
		d = dest;
		s = src;
		while (count--)
        *d++ = *s++;        
		}
	else /* overlap */
    {
		d = (char *)(dest + count - 1); /* offset of pointer is from 0 */
		s = (char *)(src + count -1);
		while (count --)
        *d-- = *s--;
    }
  
	return dest;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章