前言:
一般我们在C/C++中有两种常见的初始化字符数组的方式,如下:
//第一种
char szBuff[64] = {0};
//第二种
char szBuff[64];
memset(szBuff,0,sizeof(szBuff));
那么这两种谁更优?谁更安全?一般稳健一点的人可能会选择使用后者,毕竟自己memset了,有的人可能认为第一种方式只是将第一个字符置空,而其他位置并未初始化,这样写效率高。其实并非如此,让我们从汇编层面来分析一下。
分析过程:
第一种:
char szBuff[64] = {0};
对应的汇编代码如下:
00191013 mov byte ptr [ebp-48h],0
00191017 push 3Fh
00191019 push 0
0019101B lea eax,[ebp-47h]
0019101E push eax
0019101F call memset (191854h)
00191024 add esp,0Ch
第二种:
char szBuff[64];
memset(szBuff,0,sizeof(szBuff));
对应的汇编代码如下:
00191027 push 40h
00191029 push 0
0019102B lea ecx,[ebp-88h]
00191031 push ecx
00191032 call memset (191854h)
00191037 add esp,0Ch
结论:
其实本质上而言,两种方式最终都是通过调用memset来实现清0的,只是细微上有点点差别(当然如果字符数组很短的话,第一种方式并不一定会调用memset,而是采用多个mov来清零),总之两种方式都保证了所有的空间全部被清零了。
两种方式都可以放心使用,完全看个人喜好,但本人推荐第一种方式,优雅,但个人认为可读性稍差,菜鸟看到了未必理解。