c++ std::memset 和 std::fill 的区别
目录
3、std::memset()和 std::fill()的区别
1、std::memset()
功能:将一块内存空间的每个字节都设置为指定的值,这个函数通常用于初始化一个内存空间,或者清空一个内存空间。
示例:
void* memset(void* ptr, int value, size_t num);
· ptr:指向要设置数值的内存起始位置的指针。
· value:要设置的无符号字符值(通常是 unsigned char 类型的)。
· num:要设置的字节数。
(1)简单应用案例
例如:想要将一个字符数组中的字符全设为 a。
char c[10];
memset(c, 97, sizeof(c));
for (int i = 0; i < 10; ++i)
{
std::cout << c[i] << " ";
}
输出:
a a a a a a a a a a
解释:97 对应的二进制是 0110 0001,memset 将 c 的每一个字节都设为了 0110 0001,而 97(0110 0001)对应的字符为 a,所以 c 中的元素输出出来都是 a。
所以在设置字符串时,想要设置成什么字符,只要在 vaule 处填写对应 ascll 码值即可。
注意:memset () 一般用在字符数组中,在设置整形或者其他的类型时(例如:结构体)时,一般只能设置成 0 或者 -1。
例如:如果想要用 memset 设置 int 的值为 1,此时如果你写下下面这段代码:
int a[10];
memset(a, 1, sizeof(a));
for (int i = 0; i < 10; ++i)
{
std::cout << a[i] << " ";
}
输出:
16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009
输出结果并不是想要的 1 而是 16843009,这是因为 1 对应的二进制是 0000 0001 ,int 占四个字节,每个字节都被填充为 0000 0001,则数组中的每一个数被设置为 0000 0001 0000 0001 0000 0001 0000 0001,这个数对应的十进制值为 16843009。
(2)在二维数组中的应用
memset 在二维数组中的用法:
示例:
int a[10][10];
memset(a, 0, sizeof(a));
for (int i = 0; i < 10; ++i)
{
for (int j = 0; j < 10; ++j)
{
std::cout << a[i][j] << " ";
}
std::cout << endl;
}
输出:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
(3)在数组中清零
整型数组清零或置 -1
int arr[10];
memset(arr, 0, sizeof(arr)); // 所有元素初始化为 0
memset(arr, -1, sizeof(arr)); // 所有元素初始化为 -1
(4)结构体清零
struct Point { int x; int y; };
Point p;
memset(&p, 0, sizeof(p)); // 所有成员变量置 0
2、std::fill()
std::fill() 是 C++ 标准库中的一个函数,定义在 <algorithm> 头文件中;
std::fill()作用:它用于将指定的值赋给一个给定范围内的所有元素,常用于数据结构初始化。
#include <algorithm> // 包含 std::fill
#include <vector>
int main()
{
std::vector<int> vec = {1, 2, 3, 4, 5};
std::fill(vec.begin(), vec.end(), 0); // 将 vec 中的所有元素设置为 0
return 0;
}
3、std::memset()和 std::fill()的区别
std::memset():
(1)、直接操作内存字节,将目标区域的每个字节设置为指定值(强制转换为unsigned char),不感知数据类型。例如,对int数组赋非 0/-1 值会导致数据异常(如赋 1 会生成0x01010101)。
(2)、仅适用于POD类型(如基本类型、无虚函数的结构体),对非POD类型(如类对象)使用会破坏内存布局(如虚表指针)。
(3)、仅能安全赋 0、-1 或 特定字节值(如0x3f表示无穷大);性能更高(直接内存操作),适合大规模POD类型初始化。
std::fill():
(1)、基于迭代器操作,调用元素的赋值运算符,按对象类型初始化,支持任意值且类型安全;
(2)、适用于所有类型(包括容器和类对象),支持复杂数据结构的初始化;
(3)、可赋任意值(如自定义对象或非字节对齐值)。性能略低(需调用赋值操作),但更通用。
更多推荐
所有评论(0)