C
C
_Kirito
计算机考古党,致力于挖穿计算机的祖坟。
展开
-
glibc2.32源码浅析 -- string.h(memcpy - 内存拷贝)
鉴于博主我是个汇编渣渣(底层逻辑是大佬们用汇编写的,淦),本文不是要深入探析memcpy的细节,而仅仅是在宏观层面上搞清楚这个函数的逻辑。如果有想搞清楚具体细节的友友们,我会在文章最下面贴上我写本文参考的文章,如果还想深入探究,最好是参阅书籍。函数原型:void *memcpy (void *dstpp, const void *srcpp, size_t len)函数作用:将srcpp指向内存的后面len个字节拷贝 到 以dstpp指向内存的后面len个字节中。既然是以字节为操作单位原创 2020-12-22 20:03:33 · 460 阅读 · 0 评论 -
glibc2.9源码分析 -- string.h(strncpy - 将一个字符串的前n个字符复制到另一个字符数组中)
这个函数的实现就是从头扫描源串,然后将前n个字符放入目标字符数组中。总体给人感觉是经过了深度优化的代码,主要有以下几点值得我们去学习:1.使用寄存器中间变量,提高运行效率。2.使用位移运算代替2的倍数的乘除运算,进一步提高运行效率。3.复制时循环体以4个字符为单位操作一次,减少小循环次数,又进一步提高运行效率。从源码的分析结果来看,这个函数在复制字符串的时候会做出以下几种行为:(设n代表要复制的字符数量。)1.源串的定义不是整个原始输入字符序列,而是原始输入字符序列中出现的第一个’\0’以及其原创 2020-12-21 01:07:53 · 1086 阅读 · 0 评论 -
glibc2.9源码分析 -- string.h(strcat - 连接两个字符串)
程序很短,程序的思路和我们平常写的是一样的,但是有些地方是经过了优化的,值得我们去学习。优化点1:中间变量使用寄存器变量,提高了程序运行效率。优化点2:最后一个循环巧妙地将最后地’\0’赋值给了目标串地尾部,不需要额外地语句再去管理最后的’\0’了。下面是加入了我思考的代码(英文部分是原作者的注释):#include <string.h>#include <memcopy.h>#undef strcat/* Append SRC on the end of DEST原创 2020-12-20 01:26:42 · 323 阅读 · 2 评论 -
C程序设计语言(第二版)习题5-9-使用指针访问二维数组
我们知道,二维数组是一维数组的数组的数组,因此如果我们想要使用指针访问二维数组中的某个元素,就需要首先找到这个元素属于二维数组中的哪一个一维数组,然后再确定这个元素在这个一维数组中的哪个位置即可,即如下形式: *(*(二维数组指针+行偏移)+列偏移)上面这个形式是和...原创 2020-09-23 21:57:33 · 407 阅读 · 0 评论 -
C程序设计语言(第二版)习题5-5-strncpy,strncat,strncmp-纯指针实现
GCC版本:gcc version 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC)void strncpy(register char *s,register char *t,register size_t n){ register char *st=t; //从t头部数到t+n的位置 while(t!=st+n){ //如果t的长度小于n,则提前结束了 if(!(*s++=*t)){ return; } t++; } *s='\0'原创 2020-09-13 23:47:31 · 125 阅读 · 0 评论 -
C程序设计语言(第二版)习题5-4-strend-纯指针实现
编译gcc版本:4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)int strend(char *s,char *t){ //获取s的长度 char *ss=s; while(*s++!='\0'); size_t s_len=s-ss-1; //获取t的长度 char *st=t; while(*t++!='\0'); size_t t_len=t-st-1; //如果t的长度大于s的长度,则直接返回0 if(t_len>s_len){原创 2020-09-13 18:33:19 · 285 阅读 · 0 评论