目录
目录
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——