字符串数组初始化0 与memset 0 效率的分析
转自:http://www.xuebuyuan.com/1722207.html
结合http://blog.sina.com.cn/s/blog_59d470310100gov8.html来看。
最近要分析程序的性能,所以上网查了查资料,的处理下面结论:
#defineARRAYSIZE 2048
voidmain() {
chararrayA[ARRAYSIZE]={0};
chararrayB[ARRAYSIZE];
memset(array,0, ARRAYSIZE);
}
char arrayA[ARRAYSIZE] = {0};
编译是先arrayA[0]赋值为0, 再调用memset初始化其他的数组元素.
char arrayA[ARRAYSIZE] = {0};
效率很难比用memset高,因为综上分析,我觉得给一块内存赋值的效率很难超越memset。
语法:
#include <cstring>void*memset(void*buffer,intch,size_tcount);
memset()拷贝ch至buffer的前count字符中,并返回buffer。memset()对于以某一值初始化一段内存非常有用。例如,这个命令:
constintARRAY_LENGTH=300;charthe_array[ARRAY_LENGTH]; // zero out the contents of the_arraymemset(the_array,'\0', ARRAY_LENGTH);
…是非常有效率的方法来设置the_array中的所有值为零。
下表比较了两种不同的方式来初始化字符数组:for循环和memeset()。随着初始化数据量的增加,memset()很清晰的做的更快:
耗时for循环memset10000.0160.017100000.0550.0131000000.4430.02910000004.3370.291
如连接:
http://topic.csdn.net/u/20100208/10/e67ed254-9129-4afa-bec6-1559f114d803.html
变量的初始化
要是极度追求速度的话,“定义变量并严格初始化”并不是一条黄金法则,如果流程上并不需要对变量初始化的话。
这取决于你对“初始化”的概念是怎么理解的。如果你把初始化仅仅理解为变量定义时的初始化的话,那么“定义变量并严格初始化”有时就不是必要的了。例如下面的变量a在定义的时候就不需要对它初始化:
int a = 0; // 这里的初始化是多余的,因为它的值从标准输入设备读取。
scanf("%d", &a);
很多人就是把“变量的初始化”理解为“变量定义时的初始化”,从而坚持“定义变量并严格初始化”这条规则,这其实是不正确的。这样做会带来多余的初始化,从而降低了效率。从上面看,楼主已经意识到了这个问题,而且正在着手处理。
变量初始化的正确理解应该是“定义的变量第一次有一个给定的值(状态)”,无论这个值是通过变量定义时的初始化、定义后的赋值或者函数参数传递等方式得到。有这样的理解,那么“定义变量并严格初始化”一般情况下就是一条黄金法则(及其特殊的情况下定义变量只是为了使用它的类型特征,我们不考虑这种情况)。因为定义变量的最终目的就是使用变量(如果不使用它的话,也就不需要定义这个变量了),使用之前变量必须要从程序中得到一个给定值,这样的使用才是有意义的。
这里的“变量”可以是一般变量、数组、结构体、类(C++)或者动态分配的内存空间。
提出几条不算成熟的建议:
1:非必要情况不对内存使用memset清零,尤其是大块内存。
2:如某结构体或内存块在使用前会逐一赋值,则不需要对其进行memset初始化。
3:字符串的初始化可以对其第一个字节赋值0。
使用strcpy拷贝的字符串不需要进行初始化。
使用strncpy拷贝的字符串,建议不要先进行memset全部清零,而是在strncpy后,根据字符串实际长度,对字符串后一个字节置零。
在做流程判断的时,尽量减少使用字符串比较,而采用整形或布尔量比较。
4:减少结构体转换和copy代码。对结构体尤其是包含长字符串的结构体复制时,建议慎用memcpy,而采取逐一赋值的方式。
5: 非必要不使用malloc和free,不但容易造成内存泄露,而且动态分配内存快时,系统的内存堆状况可能会影响分配效率(比如内存碎片很多时)。建议对一些动态分配的数组,采用定义一个足够大的数组方式.(这里有个问题:局部变量的最大尺寸是多少呢,也就是说进程栈空间是多少呢?这个应该是有限制的,但是每种操作系统或编译器的限制是多少呢,应该不能在栈空间里定义一个几十M或一个G大的数组吧?)
6:unix程序是基本上是以进程模式运行的,可以合理使用全局静态变量。减少分配内存的开销。在多线程程序里慎用全局变量。
我觉得在写代码的时候,不但要把功能实现,该精益求精还是尽量注意,也许确实项目组里开发的时候对代码质量细节控制不是很严格吧。
字符串数组初始化0 与memset 0 效率的分析的更多相关文章
- c语言中字符串数组初始化的一点总结&& c++访问控制的三种方式
char *c[]={"ONE","TWO","THREE","FOUR"}; // c语言中定义了一个字符串数组(也称 ...
- C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理
C语言中,数组初始化的方式主要有三种: 1.声明时,使用 {0} 初始化: 2.使用memset: 3.用for循环赋值. 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码: #define ...
- C语言数组初始化全部为0
] = {}; 编译器会把第一个初始化值(这里是0)赋给数组的第一个元素,然后用默认值0赋给其余的元素.如果没有给出初始值,编译器不会去做初始化工作.这样简洁的方式让代码更加高效. 另一种,就是mem ...
- 字符串分隔 ->连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100 ...
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
// ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- .net字符串数组查找方式效率比较
下面是代码: static void Main(string[] args) { string[] arr = new string[] { "AAA", "BBBB&q ...
- 字符数组什么时候要加‘\0’
当字符数组以单个字符进行赋值时: char ch[10]; ch[10]={'a','b',---'\0'}; 或者用for循环进行赋值时: for (i=0; i<9; i++){ch[i]= ...
- 数组中&a与&a[0]的区别 转载自http://blog.csdn.net/FX677588/article/details/74857473
在探讨这个问题之前,我们首先来看一道笔试题,如下: [摘自牛客网]下列代码的结果是:(正确答案是 C) main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)( ...
- List转String数组 collection.toArray(new String[0])中new String[0]的语法解释
Collection的公有方法中,toArray()是比较重要的一个. 但是使用无参数的toArray()有一个缺点,就是转换后的数组类型是Object[]. 虽然Object数组也不是不能用,但当你 ...
随机推荐
- 从A文件拿B文件的某一个值
- 使用canvas绘制一片星空
效果图 五角星计算方式 代码 <body style="margin:0px;padding:0px;width:100%;height:100%;overflow:hidden;&q ...
- eclipse中设置文件默认打开方式
- 优化php代码 - 字符串echo输出 逗号也可作php连接符
2016年12月12日10:00:16 ====================== 网页访问速度的提升,是可以通过代码的优化来实现的.代码的优化,并不是说代码越少越好,而是主要看代码的运行能力和执行 ...
- java 随机数 优惠码 生成 随机字串
package test; import java.util.HashSet; import java.util.Random; import java.util.Set; public class ...
- C#------接口的理解
转载: http://blog.jobbole.com/85751/
- Angular.js通过bootstrap实现经典的表单提交
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel= ...
- .Net 中的反射(查看基本类型信息) - Part.2
反射概述 和Type类 1.反射的作用 简单来说,反射提供这样几个能力:1.查看和遍历类型(及其成员)的基本信息和程序集元数据(metadata):2.迟绑定(Late-Binding)方法和属性.3 ...
- xml格式的数据转化成数组
将得到的xml格式的数据转化成数组 <?php //构造xml $url = "http://api.map.baidu.com/telematics/v3/weather?locat ...
- word20161215
name / 名称 name mapping / 名称映射 name resolution / 名称解析 name server (NS) resource record / 名称服务器资源记录 na ...