memset来看看你真的会了吗

目录

memset

介绍

 例子

解释

第一个memset

第二个memset

第三个memset

总结

目录

介绍

 例子

解释

第一个memset

第二个memset

第三个memset

总结

来看看你是不是真的会了



memset

介绍

memset是C和C++语言中的一个函数,用于设置一块内存区域的值。它的原型定义在string.h(C语言)和cstring(C++语言)头文件中。

下面是函数原型。

void* memset(void* ptr, int value, size_t num);
    ptr:指向要设置值的内存区域的指针。
    value:要设置的值,以整数形式传递。通常是一个无符号字符的ASCII码,范围为0到255。但是它的类型为int,这样可以保证更通用的用法,将其强制转换为unsigned char后使用。
    num:要设置的字节数,即将value值复制到ptr所指向的内存区域的字节数。
 例子
#include<cstring>
#include <iostream>
using namespace std;
int main()
{
    char a[3] = { 0 };
    int b[3] = { 0 };
    int c[3] = { 0 };
    memset(a, '1', sizeof(a));
    memset(b, 1, 3);
    memset(c, 1, sizeof(c));
    cout << a[0] << " " << a[1] << " " << a[2] << endl;
    cout << b[0] << " " << b[1] << " " << b[2] << endl;
    cout << c[0] << " " << c[1] << " " << c[2] << endl;
    //结果
    //1 1 1
    //65793 0 0
    //16843009 16843009 16843009
    return 0;
}
解释
第一个memset

现在我们来解释一下

memset是按字节来赋值的,一个字节(byte) = 8比特(bit)

好了字符数组,一个元素占一个字节,总共就是3个字节。

假设是这仨    一:  0000 0000   二:  0000 0000    三:  0000 0000

在ASCII码中的字符'1'的十进制值是49,对应的二进制表示为:00110001

按字节赋值就变成了00110001        0000 0000         0000 0000

                                00110001         0011 0001         0000 0000

                                00110001         0011 0001         0011 0001

是这样赋的,一个字节一个字节的赋值,以二进制的形式。

第二个memset

我们知道,一个int是4个字节,也就是32个bit

首先我们来看b数组,把它用二进制排开来看就是下面这样

0000 0000    0000 0000     0000 0000 .....
总共16个

我们设置字节数是3,则只对前3个字节赋值。

1的二进制表示是0000 0001

赋值后就是下面这样

0000 0001    0000 0001    0000 0001     0000 0000    0000 0000....

我们的int是4个字节,我们这样看数组b

b[0]
0000 0001    0000 0001    0000 0001     0000 0000
b[1]
0000 0000    0000 0000    0000 0000     0000 0000
b[2]
0000 0000    0000 0000    0000 0000     0000 0000

聪明的你知道了吧

0000 0001    0000 0001    0000 0001     0000 0000十进制就是65793

第三个memset

可以迎刃而解了吧

memset之前

0000 0000    0000 0000     0000 0000   0000 0000

0000 0000    0000 0000     0000 0000   0000 0000

0000 0000    0000 0000     0000 0000   0000 0000

之后

0000 0001    0000 0001     0000 0001   0000 0001

0000 0001    0000 0001     0000 0001   0000 0001

0000 0001    0000 0001     0000 0001   0000 0001

而00000001 00000001 00000001 00000001  十进制就是16843009

OK,完事!

总结

memset确实快,因为是直接二进制最底层去搞的,也方便,当然上面两个就是局限。

怎么解决呢,我的建议是直接for循环吧。

快的原因在下面,自行阅读吧~

    底层优化:memset函数通常由编译器或操作系统的库函数提供,并且这些库函数通常是由经验丰富的开发者进行底层优化的。这些优化可能会使用底层硬件指令来设置内存块,例如使用SIMD指令(Single Instruction, Multiple Data)或其他优化技术,以实现更高效的内存设置。

    字节级操作:memset是按字节进行内存设置的。它不需要考虑数据类型的复杂性,而是简单地将指定的字节值复制到内存块中的每个字节,因此在执行过程中没有额外的复杂计算。

    内存块访问的连续性:memset通常以连续的方式访问内存块,这有利于缓存命中,减少了内存访问的延迟,提高了执行速度。

    特殊处理:一些编译器或库函数可能对特定的memset调用进行了特殊处理。例如,对于将内存块设置为0的memset(ptr, 0, num_bytes)调用,可能会使用更高效的内存清零指令。

byebye~~~~~~~~~

来看看你是不是真的会了

下面二行将dp数组每个元素初始化为最大值,你知道为什么吗?

int dp[100];
memset(dp, 127, sizeof(dp));

提示一下,2的7次方是128

bye——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天写bug的屑闲鱼

请我杯饮料吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值