字符串数组初始化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数组也不是不能用,但当你 ...
随机推荐
- Sikuli图形脚本测试工具安装及介绍(适合小白的测试神器)
sikuli简单安装以及介绍附图: 一.简单介绍 SikuliX官方网站:https://launchpad.net/sikuli/(官方的最新版本是SikuliX1.1.0更新于2015-10-06 ...
- mysql-data-dumper
mysql-data-dumper mysql-data-dumper最近几天写的项目. 一开始仅仅想实现一个简单的数据导出工具,方便大家使用,提升团队成员的效率.后来结果想法天马行空,所以进度有点慢 ...
- linux 下向github上传代码
上传代码: cd TPS/devices/M8 git init #//初始化 git add . #如果是.表示上传全 ...
- C#之数组篇
大杂烩 一.数组初始化 1.一维数组 String[] str = new String[3] { "1","2","3"}; ...
- mysql命令总结
统计全库数据量: use information_schema; SELECT TABLE_NAME, (DATA_LENGTH) as DataM , (INDEX_LENGTH) as Index ...
- 一、基于hadoop的nginx访问日志分析---解析日志篇
前一阵子,搭建了ELK日志分析平台,用着挺爽的,再也不用给开发拉各种日志,节省了很多时间. 这篇博文是介绍用python代码实现日志分析的,用MRJob实现hadoop上的mapreduce,可以直接 ...
- Python Day2
一.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 新建一个列表 name = ['ShaoLin','Tom','Kimi','Rain','A ...
- Python调用服务接口
#! /usr/bin/env python # coding=utf-8 ############################################################## ...
- [Head First设计模式]山西面馆中的设计模式——观察者模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在 ...
- Java 程序的内存泄露问题分析
什么是内存泄露? 广义的Memory Leak:应用占用了内存,但是不再使用(包括不能使用)该部分内存 狭义的Memory Leak:应用分配了内存,但是不能再获取该部分内存的引用(对于Java,也不 ...