c语言memset源码分析

Posted C语言专家集中营

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言memset源码分析相关的知识,希望对你有一定的参考价值。

一、用法

 

二、源码

下面来看memset的实现:(代码来自《C标准库》P398)

1 void *(memset) (void *s,int c,size_t n)2 {3     const unsigned char uc = c;4     unsigned char *su;5     for(su = s;0 < n;++su,--n)6         *su = uc;7     return s;8 }

c语言memset源码分析

第3行把int类型的c转换成unsigned char类型,意味着截去c的高24位,只保留低8位。第4行把s当作unsigned char*类型,也就是说su中的每一个元素按8位计算。
现在来看看文章开头的那个代码会做什么。
c的二进制 : 00000000000000000000000000000001(32位)
1、c转换为unsigned char 后:00000001(8位)
2、将指针su(unsigned char类型)的每一元素(8位)赋值为00000001,循环4n次。
3、memset()结束后,arr的每个元素按照int类型读取,读出来的就是1000000010000000100000001,十进制就是16843009。
不过如果是memset(arr,0,n*sizeof(int));的话可以使用,因为32位都是0

 

三、效率分析

再来说memset()的效率问题。使用memset函数与将上面的函数代码写在自己的程序里是不一样的,C标准库中的memset对Cache的利用做了优化,具体的在《C专家编程》151页有解释(其实是我没看懂),这里给出测试:

 1 #include <string.h> 2 #define MAXSIZE 100000 3  4 int main() 5 { 6     char arr[MAXSIZE]; 7     for(int i=0;i<10000;i++) 8     { 9         memset(arr,'0',sizeof(arr));10 //        for(int j=0;j<MAXSIZE;j++)11 //            arr[0] = '0';12     }13     return 0;14 }

程序里的注释部分与memset行分别使用,结果是使用memset的程序运行时间大约为0.1s,而用for循环的程序要3s多。
综上:memset()可以用在字符数组的初始化以及类似于memset(arr,0,n*sizeof(int));的情况,效率比手动赋值要高的多。

 


以上是关于c语言memset源码分析的主要内容,如果未能解决你的问题,请参考以下文章

http协议解析 请求行的信息怎么提取 c语言源码

c语言memset()函数

PID控制算法C源码

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

C语言memset问题

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段