下载源码。
首先,我们得下载C语言源码,其实在我们使用的一些编译器中也有C语言源码。
C语言源码下载网站
我这里选择的是画圈的部分,如果有其它的下载网站也可以使用。
第一节:学习string文件夹下的函数功能实现。
bzero.cpp
void
__bzero (void *s, size_t len)
{
memset (s, '\0', len);
}
weak_alias (__bzero, bzero)
可以看出,bzero函数文件下函数是是封装了memset,那么我们接下来看memset。
memset.cpp
#include <string.h>
#include <memcopy.h>
#undef memset
void *
inhibit_loop_to_libcall /*这段代码的意思是什么*/
memset (void *dstpp, int c, size_t len)
{
long int dstp = (long int) dstpp;
if (len >= 8)
{
size_t xlen;
op_t cccc;
cccc = (unsigned char) c;
cccc |= cccc << 8;
cccc |= cccc << 16;
if (OPSIZ > 4)
/* Do the shift in two steps to avoid warning if long has 32 bits. 为什么要分两步转移呢? */
cccc |= (cccc << 16) << 16;
/* There are at least some bytes to set.
No need to test for LEN == 0 in this alignment loop. */
/*看不懂,dstp得到的只不过是需要拷贝对象内存中前几个字节转换成对应的值。为什么将c赋值给它。*/
while (dstp % OPSIZ != 0)
{
((byte *) dstp)[0] = c;
dstp += 1;
len -= 1;
}
/* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
xlen = len / (OPSIZ * 8);
while (xlen > 0)
{
((op_t *) dstp)[0] = cccc;
((op_t *) dstp)[1] = cccc;
((op_t *) dstp)[2] = cccc;
((op_t *) dstp)[3] = cccc;
((op_t *) dstp