c语言memset源码

c语言memset源码

一、用法

void *memset(void *s, int ch, size_t n);
作用:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作。
不知道有没有像我一样把memset当作万能的初始化工具,例如:
int arr[n];
memset(arr,1,n*sizeof(int));
这样得到的arr数组一定不是全0,而是16843009,下面解释原因。
首先,变量类型的本质只是标志从某一内存地址开始读取的位数,强制转换就是改变读取位数的大小。

二、源码

下面来看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 }

第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));的情况,效率比手动赋值要高的多。

参考:http://blog.csdn.net/hackbuteer1/article/details/7343189#

时间: 2024-08-10 17:17:45

c语言memset源码的相关文章

(转)go语言nsq源码解读二 nsqlookupd、nsqd与nsqadmin

转自:http://www.baiyuxiong.com/?p=886 ----------------------------------------------------------------------- 上一篇go语言nsq源码解读-基本介绍  介绍了最基本的nsq环境搭建及使用.在最后使用时,我们用到了几个命令:nsqlookupd.nsqd.nsqadmin.curl及 nsq_to_file,并看到用curl命令写入的几个”hello world”被nsq_to_file命令保

华为面试题:一元多项式的化简 C语言实现源码

编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式. 说明: 1.多项式由若干个单项式组成,单项式之间为加.减(+,-)关系. 2.单项式指数字与字母幂的乘积构成的代数式.对一元多项式,字母只有一种. 3.同类项合并指将多项式中指数相同的单项式,系数经过加减求和,合并为一个单项式.按指数降序指多项式中,单项式按指数从大到小顺序 相连. 格式说明 一元多项式输入输出时以字符串形式表示,格式如下 l.单项式之间用单个加减运算符相连,运算符:+,- 2.单项

C语言简短源码计算超大整数的阶乘

把写代码过程中比较好的代码段做个记录,下边资料是关于C语言简短计算超大整数的阶乘的代码,应该对小伙伴们有较大用处. int a[100000]={1},n,i,c,m=1;main(){scanf("%d",&n);for(;n;n--){for(c=i=0;i<m||c;)}for(;m;)putch(a[--m]+48);} 原文地址:https://blog.51cto.com/14131177/2377184

比特币挂机网赚易语言源码日赚200已上+网站+视频全套

是于易语言开发而成 在线挂机获取收益 软件内设VIP系统 提款系统 推广系统 等多功能化 如而要易语言程序源码的可以联系我QQ 382913699 注册的话需要下载软件,软件大小不到2M,下载下来后注册下,一般一天可以挖200块钱左右!提现的不是VIP一天只能提现1次,一次0.3元! VIP没有这个限制!首先我不是VIP所以不敢断言一定 所以请大家帮个忙,复制下网址访问下就可以了! 等访问量达到500一定给大家反馈下!就算是假的 一天领0.3元也好啊

多目标遗传算法 ------ NSGA-II (部分源码解析)介绍

NSGA(非支配排序遗传算法).NSGA-II(带精英策略的快速非支配排序遗传算法),都是基于遗传算法的多目标优化算法,是基于pareto最优解讨论的多目标优化. 在官网: http://www.iitk.ac.in/kangal/codes.shtml 可以下载到  NSGA-II  的C语言版源码,下载最新版后打开如下: 其中,nsga2r.c  为主文件,打开后找到核心代码,如下: 1 for (i=2; i<=ngen; i++) 2 { 3 selection (parent_pop,

Linux程序包管理之yum仓库、源码编译安装

CentOS:yum,dnf URL:ftp://172.16.0.1/pub yum是C/S架构,是rpm的前端工具,依赖于rpm存在的: 1.本地要有yun程序: 2.本地要有配置文件(配置远程服务器yum仓库或本地服务器yum仓库): 3.要有存在的文件服务器(程序包仓库即yum仓库).(也可以在本地配置服务器yum仓库): yum支持的服务器有两种:一种是ftp服务器,第二种是http服务器: yum工作简述: yum是客户端,也认为是自我独立管理的组件,需要联系远程的仓库,从仓库中下载

YUM及源码编译安装

yum的基本概述: yum是rpm的前端工具,可以利用元数据文件了解到一个仓库中有哪些包,每个包之间的依赖关系,并自动解决,yum会缓存这个文件, 并且通过分析校验码(repomd.xml)文件来检查yum仓库是否更新了,来同步自身缓存的元数据文件.当然每个rpm包制作的时候就已经在文件列表中写明了自己依赖那些包,和开发工具等 createrepo可以分析某个目录下有什么rpm包,各个rpm包内含的信息列表,和依赖关系 一般情况下安装系统的CD就当做一个仓库(repository), yum r

编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码

转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment (build 1.8.0_31-b13)Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)OS:win7 64bitcmake:V2.8.12/V3.2.2LTP:V3.2.0LTP4J:V1.0Microsoft VS C+

Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】

原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938390.html 在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段, 下面我就顺这代码逐个函数的解释,但是这里并不会过于深入