发现了一个字符数组初始化的误区,而这个往往能导致比较严重的性能问题,现在分享给大家。
往往我们在初始化一个字符 数组,大概有如下几种写法:
char array1[1024] ="";
char array2[1024] = {0};
char array3[1024] = {'\0'};
char array4[1024];
array4[0] ='\0';
但这四种写法,其实代表含义不同,看起来前三种写法只是将array的第一个字符置为0,其实前三种在gcc编译时,都是调用了memset来将整个array置为0,如果这个array很长,其实也会导致性能问题。我写了一个简单的小程序编译生成test,
字符串初始化四种写法objdump了一下,执行“objdump -S test”可以看下面的代码:
objdump反汇编结果所以,对这四种写法,实际执行的代码解释如下:
char array1[1024] ="";//如上图1处,调用memset将1023个字符置为0
char array2[1024] = {0};//如上图2处,调用memset将1024个字符置为0
char array3[1024] = {'\0'};//如上图3处,调用memset将1024个字符置为0
char array4[1024];
array4[0] ='\0';//如上图4处,只是将第一个字符置为0
而对于字符数组,往往只是作为一个字符串的临时缓冲区使用,没有必要将整个数组置为0,所以第四种写法往往就能达到初始化的目的。建议大家使用第四种写法来初始化一个字符数组,这样能节约很多性能消耗。
网友评论