转自: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. RabbitMQ Lazy Queue 延迟加载

    Lazy Queue 在著名的单例设计模式中就有懒汉式的实现方式,也就是只有在你需要的时候我才去加载. 这让博主想到了以前上学的时候,每到了假期的假期作业,在假期的时候是从来不做的.只有在快开学老师要 ...

  2. 《Python核心编程》 18.多线程编程(一)

    一进程和线程 1参考链接: http://www.zhihu.com/question/25532384 中OF小工和zhonyong 的回答 总结他们两的回答: 引言: 1.电脑的运行,在硬件上是C ...

  3. 动力节点Java培训告诉你Java线程的多功能用法

    现在的java开发可谓是八仙过海各显神通啊!遥想当下各种编程语言萎靡不振,而我Java开发异军突起,以狂风扫落叶之态,作为Java培训行业的黄埔军校,为了守护Java之未来,特意总结了一些不被人所熟知 ...

  4. AE开发中栅格图层实现分级渲染

    GP工具IDW执行后,生成的栅格图层是黑白二色,需要手动进行分级渲染,似乎不是所有栅格图层都可以进行分级渲染,注意异常处理.注意ARCMAP中是有颜色的,无需自己处理. IRasterClassify ...

  5. grunt安装和使用教程

    grunt的安装 npm intall -g grunt-cli 新建文件夹grunt,在本地文件中添加package.json和Gruntfile.js文件,其中package.json文件的配置如 ...

  6. golang笔记——struct

    1.定义一个结构体 type User struct { userid int username string password string } 2.初始化一个结构体 有两种情况,一是得到结构体的对 ...

  7. 移动端框架篇-控制父容器的滑屏框架-slip.js

    设计滑屏框架的办法一般有2种 控制父容器法 控制子容器法 这个算是控制父容器法 通过控制父容器的transform: translateY或margin-top或top的值来上下滑动页面,每次的位移的 ...

  8. tyvj1005 采药

    描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞 ...

  9. java中的等于

    数字的比较等于用“==” 不等于用“!=” 字符的比较等于用“.equals”不等于用”!s1.equals(s2)“

  10. CPU思考

    线程高并发 会导致CPU load长,线程大运算量和大量线程 会导致CPU利用率高 因为CPU处理都是原子操作的,8核CPU在同一时刻最多也只能处理8个线程,但是因为处理的非常快,所以即使几万个简单线 ...