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/

浙公网安备 33010602011771号