亲宝软件园·资讯

展开

C++ memset误区 C/C++ memset方法的误区

李春港 人气:0
想了解C/C++ memset方法的误区的相关内容吗,李春港在本文为您仔细讲解C++ memset误区的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:C++,memset方法,C++,memset误区,下面大家一起来学习吧。

一、函数作用

最简单的调用就是将一个数组清零,代码如下:

const int maxn = 1024;
int a[maxn];
memset(a, 0, sizeof(a)); // 结果:a[0]=a[1]=a[...]=0;

二、效率对比

直接调用 memset 接口清零 和 调用循环进行清零,进行一个测试后如下:

对长度为 10000000 的数组,执行100次调用;

模式 memset for
debug 375ms 2156ms
release 343ms 329ms

三、误区总结

1、按字节设置

memset 实现原理是根据字节来设置的,比如对于字节数组char a[100],将所有字节都设置为5,就可以调用:

memset(a, 5, sizeof(a));

但是,对于int b[100],也采用这种方法,就会导致错误:

memset(b, 5, sizeof(b));

总结表格如下:

 

memset值 char short int long long
0 0 0 0 0
-1 -1 -1 -1 -1
5 5 1285 84215045 361700864190383365

2、设置的值只有最低字节有效

memset(a, 0x05ffffff, sizeof(a));
memset(a, 0xffffff05, sizeof(a));
memset(a, 0xffffff08, sizeof(a));
memset(a, 0x12345678, sizeof(a));

设置值的时候,只会采用最低的字节作为赋值用,通俗的讲,就是以上四句话调用,等价于:

memset(a, 0xff, sizeof(a));
memset(a, 0x05, sizeof(a));
memset(a, 0x08, sizeof(a));
memset(a, 0x78, sizeof(a));

3、堆内存不可直接 sizeof 取首地址

在堆上申请了一个数组空间,并且想要给它初始化,调用如下:

const int maxn = 1024;
int *p = new [maxn];
memset(p, 0, sizeof(p));
const int maxn = 1024;
int *p = new [maxn];
memset(p, 0, maxn * sizeof(int));

4、传参数组不可直接 sizeof 取首地址

对传参为数组的数据进行 memset,调用如下:

void fun(int a[maxn])
{    
    memset(a, 0, sizeof(a));
}
void fun(int a[maxn]) 
{    
    memset(a, 0, maxn * sizeof(int));
}

当然,当传参是结构体指针的时候也是如此;

参考于:CSDN-英雄哪里出来https://blog.csdn.net/WhereIsHeroFrom/article/details/111660632

加载全部内容

相关教程
猜你喜欢
用户评论