繁体   English   中英

fill_n vs memset 设置数组的默认值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM