C语言数组初始化的三种方法
C语言中,数组初始化的方式主要有三种:
1、声明时,使用 {0} 初始化;
2、使用memset;
3、用for循环赋值。
那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码:
#define ARRAY_SIZE_MAX (1*1024*1024)void function1()
{char array[ARRAY_SIZE_MAX] = {0}; //声明时使用{0}初始化为全0
}void function2()
{char array[ARRAY_SIZE_MAX];memset(array, 0, ARRAY_SIZE_MAX); //使用memset方法
}void function3()
{int i = 0;char array[ARRAY_SIZE_MAX];for (i = 0; i < ARRAY_SIZE_MAX; i++) //for循环赋值{array[i] = 0;}
}
效率:
分别执行上面三种方法,统计下平均时间可以得出: for循环浪费的时间最多,{0} 与memset 耗时差不多。
原理:
1、for循环赋值,就是循环赋值,不解释了
2、memset,很容易找到memset内部实现代码,这里也不解释了
3、{0} 内部是怎么实现的呢?
将上述代码编译成汇编格式如下:
function1如下:
pushl %ebpmovl %esp, %ebpsubl $1048600, %espleal -1048584(%ebp), %eaxmovl $1048576, %edxmovl %edx, 8(%esp)movl $0, 4(%esp)movl %eax, (%esp)call memsetleaveret
function2如下:
pushl %ebpmovl %esp, %ebpsubl $1048600, %espmovl $1048576, 8(%esp)movl $0, 4(%esp)leal -1048584(%ebp), %eaxmovl %eax, (%esp)call memsetleaveret
通过汇编代码可以看出,{0}初始化方式,调用了memset函数!
对三种方法的选取:
1、for 最浪费时间,不建议(其实memset内部也是用循环实现的,只不过memset经过了严格优化,所以性能更高);
2、{0} 可能有移植性问题,虽然绝大多数编译器看到{0} 都是将数组全部初始化为0, 但是不保证所有编译器都是这样实现的;
3、综合1、2, 推荐使用memset方法。
上述代码,结果以及观点仅仅是一家之言,如果有问题,多谢指正!
C语言数组初始化的三种方法相关推荐
- c语言定义不定长数组初始化_C语言数组初始化的三种方式
1.{0} 初始化 int arr1[3] = {0}; 使用 {0} 的方式最简洁,一般在定义的时候使用. 2.for 循环初始化 int arr2[3]; for (int i = 0; i &l ...
- c语言数组最大可定义多少位_C语言求数组的最大值三种方法
/* 黄哥Python培训 黄哥所写*/#include int maxValue(int* arr, int n);int maxRecursionValue(int* arr, int n);in ...
- C语言中调用数组元素的三种方法:下标法、数组名法、指针法
/*调用数组元素的三种方法:下标法.数组名法.指针法*/ #include<stdio.h> int main() {int a[] = { 1,2,3,4,5 }, i, * p;pri ...
- C语言常见问题——数组初始化的四种方法
有一回,小易同学对我说:"你学过编程吗",我略略点一点头.他说,"学过编程,我便考一考你,在使用数组之前,应不应该初始化数组?" 我暗想,这么简单的问题,也配考 ...
- java类初始数组_java中数组初始化的三种方式是什么
java中数组初始化的三种方式是:1.静态初始化,如[int a[] = {2, 0, 1, 9, 2020}]:2.动态初始化,如[int[] c = new int[4]]:3.默认初始化,如[i ...
- JAVA输出数组元素的三种方法(for/for each/toString)
2022_02_19学习输出数组元素的三种方法以及c语言和java中数组的不同点 方法一:for循环输出数组元素 方法二:for each循环语句 方法三:Arrays类中的toString方法 c语 ...
- C语言求最大公约数三种方法详解
C语言求最大公约数三种方法详解 题目要求 常用写法(穷举法) 辗转相减法 辗转相除法 main函数 整体代码 题目要求 运行最大公约数的常用算法,并进行程序的调式与测试. 常用写法(穷举法) 从两个数 ...
- JS数组添加元素的三种方法
JS数组添加元素的三种方法 1.push() 方法可以向数组末尾添加一个或多个元素,并且返回新的长度 语法:arr.push(element1,element2,element3,····) 参数 概 ...
- 数组初始化的三种方式
数组初始化的三种方式 动态初始化:数组定义与为数组分配空间和赋值的操作分开进行: 静态初始化:在定义数字的同时就为数组元素分配空间并赋值: 默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此 ...
最新文章
- 0314互联网新闻 | 陌陌秘密发布6款产品;白熊求职完成数百万元天使轮融资
- 从windows server的文件服务到分布式文件服务(二)
- P4199-万径人踪灭【FFT】
- JVM因“ OutOfMemory”错误而关闭-我该怎么办?
- 设计模式学习笔记——组合(Composite)模式
- 定义css设备类型-Media Queries
- 用JavaScript和HTML5创建文件上传器
- 查找一:C++静态查找
- java将数据写入csv文件,从csv文件中读取数据
- 理解GAN生成对抗网络
- Quora 用了哪些技术 ?(zz)
- 室外定位篇:一文解读高精度RTK定位
- linux的ls -l显示的total 4是什么意思?我使用ls -a -l显示的total12,同一个文件夹显示了不同的信息?
- 620集成显卡和mx250,残血还是满血?一招看清MX250显卡真面目
- 第五届强网杯全国网络安全挑战赛 题目复现(有题目附件,详解)
- 详解Transformer中Self-Attention以及Multi-Head Attention
- 【阿里云IoT+YF3300】10.快速开发188协议设备驱动
- 针对源代码保密源代码安全管理产品选型建议
- 靶机实战(bulldog)
- Itext pdf的页眉页脚
热门文章
- win10打开程序响应很慢_Win10系统打开此电脑卡住不能正常打开的解决办法
- 手机突然没信号!伪基站究竟是怎样搞鬼的?
- android压感屏幕,原生Android确认支持压感屏:苹果懵逼了
- OPNET和STK软件修改背景颜色用于黑白打印
- python自动生成鸡汤文_马尔可夫链文本生成的简单应用:不足20行的Python代码生成鸡汤文...
- Python测试平台开发实战
- Vue为什么能逆袭 Angular和React成为主流前端框架?
- 拉格朗日插值 - 洛谷 P4781
- OpenStack相关的邮件列表和IRC
- 虚拟机启动没有ip地址