bcopy()函数(转)

刚刚又看了一遍bsd的bcopy()的实现,简单记录一下,以后免得又去想,方便以后复习。

 

先是typedef int word,方便后面直接用word类型

#define wsize sizeof(int) //一个int的大小

#define wmask wsize-1 //掩码,后面用来判断对齐的

 

bsd的bcopy同时是memcpy()和memmove()的实现,这个在申明的地方可以看出来,一串的宏定义。

 

1.

if ( (unsigned long)dst < (unsigned long)src )

进入函数,先判断dst和src哪个在前面,当dst在低地址的时候,从前向后拷贝,否则从后向前拷贝。

 

2.

t = (uintptr_t)src;

if ( (t|(uintptr_t)dst) & wmask )

判断地址是否对齐到wsize的整数倍,一般就是4了

 

3.

if ( (t^(uintptr_t)dst)&wmask || length<wsize )

当地址没有对齐到wsize的整数倍的时候,判断dst和src是否都刚好超出wsize对齐地址的相同字节数(这个有点不好叙述)或者拷贝字节是不是小于wsize,即是判断dst地址的最末三位(二进制)和src地址最末三位(二进制),比如两个的地址末尾都是0x0001,或者0x0002这样。如果两者超出对齐地址相等字节,就先把超出的这几个字节用char指针拷完,然后用int指针拷;如果超出对齐字节的字节数目不等,就只能全部用char拷贝了,如果用int会出现位对齐的访问,效率低,同时可能发生bus error。

 

原地址:http://blog.163.com/msdaoz@126/blog/static/11309782200692713446828/

posted @ 2012-12-05 19:08  孤独~根号三  阅读(293)  评论(0)    收藏  举报