数组初始化的常用方法及其原理

数组初始化的方式主要有三种:

1、声明时,使用 {1,2,3,….} 初始化;

2、使用memset(void *s,int ch,size_t n);

3、用for循环赋值;

void *memset(void *s, int ch, size_t n);

函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

三种方法效率比较:

#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循环浪费的时间最多,{1,2,3,….} 与memset 耗时差不多。

将上述代码编译成汇编格式如下:
function1如下:

pushl   %ebp  
movl    %esp, %ebp  
subl    $1048600, %esp  
leal    -1048584(%ebp), %eax  
movl    $1048576, %edx  
movl    %edx, 8(%esp)  
movl    $0, 4(%esp)  
movl    %eax, (%esp)  
call    memset  
leave  
ret 

function2如下:

pushl   %ebp  
movl    %esp, %ebp  
subl    $1048600, %esp  
movl    $1048576, 8(%esp)  
movl    $0, 4(%esp)  
leal    -1048584(%ebp), %eax  
movl    %eax, (%esp)  
call    memset  
leave  
ret

通过汇编代码可以看出,{0}初始化方式,调用了memset函数!

对三种方法的选取:

1、for 最浪费时间,不建议(其实memset内部也是用循环实现的,只不过memset经过了严格优化,所以性能更高);

2、{1,2,3,….} 可能有移植性问题,虽然绝大多数编译器看到{0} 都是将数组全部初始化为0, 但是不保证所有编译器都是这样实现的;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值