最简单的调用就是将一个数组清零,代码如下:
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 |
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 |
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));
在堆上申请了一个数组空间,并且想要给它初始化,调用如下:
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));
对传参为数组的数据进行 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