[英]fill_n vs memset to set default value of an array
我想知道如果你想用默认值 n 填充数组,理想的方法是什么:
#include <cstring> // for memset
#include <algorithm> // for fill_n
static constexpr int N = 100;
int a[N];
static constexpr int defaultValue = -1;
void* memset( void* dest, int ch, std::size_t count );
memset(a, defaultValue, sizeof(a));
(memset) 将值 ch 转换为 unsigned char 并将其复制到 dest 指向的 object 的每个第一个 count 字符中。 如果 object 是潜在重叠的子对象或不是 TriviallyCopyable(例如,标量、C 兼容结构或可简单复制类型的数组),则行为未定义。 如果 count 大于 dest 指向的 object 的大小,则行为未定义。
或者
constexpr OutputIt fill_n( OutputIt first, Size count, const T& value );
fill_n(a, N, defaultValue);
(fill_n) 如果 count > 0,则将给定值分配给从 first 开始的范围内的第一个 count 元素。否则不执行任何操作。
我正在寻找见解,我当然知道如何阅读文档!
编辑:defaultValue 可能不仅仅是-1。
这两个函数做不同的事情。 当然,他们填充了一块 memory,但他们这样做的方式完全不同。
memset
在字节级别运行。 defaultValue
被破解为unsigned char
,因此大于可以容纳单个字节的defaultValue
被缩减为大小并且信息丢失。 现在字节大小的值单独应用于每个字节,而不是数组中的每个int
。 在 -1 的情况下,您会得到“幸运”,因为 0xFF 的四个字节看起来相同,即 0xFFFFFFFF,作为 32 位整数世界中的二进制补码 -1。 大多数其他数字没有这样的运气。 例如,1 不会导致一个充满int
的数组设置为 1,而是用 0x01010101 或 16843009 填充。
另一方面, fill_n
尊重数组元素的类型。 数组中的每个int
都将设置为defaultValue
。 在defaultValue
为 1 的情况下,数组将充满 1。 defaultValue
为 256,提供一个 256 的数组。
就速度而言,这可能并不重要。 如今,以字节读取或写入的 Memory 已很少见。 一次写入整个int
可能会更快。 但是一个好的memset
实现知道这一点并将利用它。 如果没有,编译器可能会。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.