转自: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。

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 效率的分析的更多相关文章

  1. c语言中字符串数组初始化的一点总结&& c++访问控制的三种方式

    char *c[]={"ONE","TWO","THREE","FOUR"}; // c语言中定义了一个字符串数组(也称 ...

  2. C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理

    C语言中,数组初始化的方式主要有三种: 1.声明时,使用 {0} 初始化: 2.使用memset: 3.用for循环赋值. 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码: #define ...

  3. C语言数组初始化全部为0

    ] = {}; 编译器会把第一个初始化值(这里是0)赋给数组的第一个元素,然后用默认值0赋给其余的元素.如果没有给出初始值,编译器不会去做初始化工作.这样简洁的方式让代码更加高效. 另一种,就是mem ...

  4. 字符串分隔 ->连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

        •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100 ...

  5. git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0

    // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...

  6. .net字符串数组查找方式效率比较

    下面是代码: static void Main(string[] args) { string[] arr = new string[] { "AAA", "BBBB&q ...

  7. 字符数组什么时候要加‘\0’

    当字符数组以单个字符进行赋值时: char ch[10]; ch[10]={'a','b',---'\0'}; 或者用for循环进行赋值时: for (i=0; i<9; i++){ch[i]= ...

  8. 数组中&a与&a[0]的区别 转载自http://blog.csdn.net/FX677588/article/details/74857473

    在探讨这个问题之前,我们首先来看一道笔试题,如下: [摘自牛客网]下列代码的结果是:(正确答案是 C) main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)( ...

  9. List转String数组 collection.toArray(new String[0])中new String[0]的语法解释

    Collection的公有方法中,toArray()是比较重要的一个. 但是使用无参数的toArray()有一个缺点,就是转换后的数组类型是Object[]. 虽然Object数组也不是不能用,但当你 ...

随机推荐

  1. AOJ DSL_2_C Range Search (kD Tree)

    Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...

  2. inference和learning

    一开始对于机器学习,主要是有监督学习,我的看法是: 假定一个算法模型,然后它有一些超参数,通过喂多组数据,每次喂数据后计算一下这些超参数.最后,数据喂完了,参数取值也就得到了.这组参数取值+这个算法, ...

  3. WPF基础到企业应用系列6——布局全接触

    本文转自:http://knightswarrior.blog.51cto.com/1792698/365351 一. 摘要 首先很高兴这个系列能得到大家的关注和支持,这段时间一直在研究Windows ...

  4. shell判断条件整理

    1.字符串判断 str1 = str2 当两个字符串串有相同内容.长度时为真 str1 != str2 当字符串str1和str2不等时为真 -n str1 当字符串的长度大于0时为真(串非空) -z ...

  5. 深度分析mysql GROUP BY 与 ORDER BY

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQLi ...

  6. 在.net中使用GAC

    转自:http://blog.log4d.com/2011/01/gac/ GAC GAC是什么?是用来干嘛的?GAC的全称叫做全局程序集缓存,通俗的理解就是存放各种.net平台下面需要使用的dll的 ...

  7. linux 根据文件大小查找文件

    inux下的find命令用来查找文件,通过man find就知道它是无所不能的.所以按照文件大小来查找文件就不在话下.从man find搜索size,可以看到如下信息: -size n[cwbkMG] ...

  8. cf723a The New Year: Meeting Friends

    There are three friend living on the straight line Ox in Lineland. The first friend lives at the poi ...

  9. C#之关机事件

    一.背景 做了个APP,通过向下位机发送串口数据,然后通过串口去控制多路光源,现在的问题来了,若是电脑强行关机,而APP又没在电脑关机前做任何动作,导致电脑已经关机了,而下位机控制的灯源还在工作.所以 ...

  10. 【转】PHP curl CURLOPT_HTTPHEADER设置HOST

    为了安全,我们的web服务主机往往不能上网.维护的时候,也是通过跳板机,ssh登录后去操作. 有时候我们的程序需要访问外网.比如需要调用外网其他程序的某个接口.这下该怎么办呢? 我们可以通过PHP的C ...