【转】 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)
- void *(memset) (void *s,int c,size_t n)
- {
- const unsigned char uc = c;
- unsigned char *su;
- for(su = s;0 < n;++su,--n)
- *su = uc;
- return s;
- }
第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页有解释(其实是我没看懂),这里给出测试:
- #include <string.h>
- #define MAXSIZE 100000
- int main()
- {
- char arr[MAXSIZE];
- for(int i=0;i<10000;i++)
- {
- memset(arr,'0',sizeof(arr));
- // for(int j=0;j<MAXSIZE;j++)
- // arr[0] = '0';
- }
- return 0;
- }
程序里的注释部分与memset行分别使用,结果是使用memset的程序运行时间大约为0.1s,而用for循环的程序要3s多。
综上:memset()可以用在字符数组的初始化以及类似于memset(arr,0,n*sizeof(int));的情况,效率比手动赋值要高的多。
转:http://blog.csdn.net/hackbuteer1/article/details/7343189
最新文章
- SQL Server删除distribution数据库
- 使用AFNetWorking 实现以Basic Authentication方式获取access-token
- nullcom HackIM2016 -- Programming Question 4
- FragmentStatePageradapter 与 FragmentPageradapter的区别
- thinkphp的CURD操作
- android MPAndroidChart饼图实现图例后加数字或文本(定制图例)
- Asp.net mvc项目架构分享系列之架构概览
- 继承 Bean 配置
- Chapter 5
- UIWebView 获取当前的javascript上下文,并js,oc互调
- Oracle数据库管理之创建和删除数据库
- Using HTML5 audio and video
- Velocity(3)——#set指令
- BZOJ 4326 运输计划
- 008-Python-模块
- PXE(preboot execution environment):【网络】预启动执行环节:安装 ubuntu、rehat系列:成功
- 从CSR产品名录看公司发展历程和业务方向
- LOJ2687 BOI2013 Vim 线头DP
- Node.js包的依赖及版本号(转)
- 【Eclipse】Eclipse如何如何集成Tomcat服务器
热门文章
- Decimal To Fraction 小数转换成分数
- Python基础、文件处理
- debuggee python
- dr.wondr博士随笔之三星某古董智能机GTXXXX 的取证恢复一例
- 关于css的一些知识点整理
- 用代码来理解 C#委托与事件
- “stdafx.h”: No such file or directory
- testng依赖,顺序,跳过
- [问题2014S11] 复旦高等代数II(13级)每周一题(第十一教学周)
- HDU3333 Turing Tree 树状数组+离线处理