C++ fill\n vs memset设置数组的默认值
我想知道如果要用默认值n填充数组,理想的方法是什么:C++ fill\n vs memset设置数组的默认值,c++,memset,C++,Memset,我想知道如果要用默认值n填充数组,理想的方法是什么: #包含//用于memset #包括//用于填充\u n 静态constexpr int N=100; int a[N]; 静态constexpr int defaultValue=-1; void*memset(void*dest、int-ch、std::size\u t count) memset(a,defaultValue,sizeof(a)); (memset)将值ch转换为无符号字符,并将其复制到dest指向的对象的每个第一个计
#包含//用于memset
#包括//用于填充\u n
静态constexpr int N=100;
int a[N];
静态constexpr int defaultValue=-1;
void*memset(void*dest、int-ch、std::size\u t count)代码>
memset(a,defaultValue,sizeof(a));
(memset)将值ch转换为无符号字符,并将其复制到dest指向的对象的每个第一个计数字符中。如果对象是可能重叠的子对象或不可平凡复制(例如,标量、C兼容结构或可平凡复制类型的数组),则行为未定义。如果count大于dest指向的对象的大小,则行为未定义
或
constexpr输出填充(输出优先、大小计数、常数和值)代码>
fill_n(a,n,defaultValue);
(fill_n)如果count>0,则将给定值指定给从first开始的范围内的first count元素。否则什么也不做
我在寻找见解,我当然知道如何阅读文档
编辑:defaultValue可能不仅仅是-1。两个函数的作用不同。当然,它们会填满一块内存,但它们的方式完全不同
memset
在字节级别运行defaultValue
被砍成了一个unsigned char
,因此一个defaultValue
大于一个字节所能容纳的值的值会被缩减,信息会丢失。现在字节大小的值分别应用于数组中的每个字节,而不是每个int
。在-1的情况下,您会得到“幸运”,因为值0xFF的四个字节看起来是相同的,0xFFFFFF,在32位整数的世界中作为2的补充-1。大多数其他数字都没有这样的运气。例如,1不会导致一个数组中满是int
,将其设置为1,它将填充0x01010101或16843009
另一方面,fill\n
尊重数组元素的类型。数组中的每个int
都将设置为defaultValue
。如果defaultValue
为1,数组将充满1defaultValue
共256个,提供了一个满256个的数组
就速度而言,这可能无关紧要。如今,以字节读取或写入内存是一种罕见的现象。一次写入整个int
s可能会更快。但是一个好的memset
实现知道这一点,并将利用它。如果没有,编译器很可能会这样做。这两个函数做不同的事情。当然,它们会填满一块内存,但它们的方式完全不同
memset
在字节级别运行defaultValue
被砍成了一个unsigned char
,因此一个defaultValue
大于一个字节所能容纳的值的值会被缩减,信息会丢失。现在字节大小的值分别应用于数组中的每个字节,而不是每个int
。在-1的情况下,您会得到“幸运”,因为值0xFF的四个字节看起来是相同的,0xFFFFFF,在32位整数的世界中作为2的补充-1。大多数其他数字都没有这样的运气。例如,1不会导致一个数组中满是int
,将其设置为1,它将填充0x01010101或16843009
另一方面,fill\n
尊重数组元素的类型。数组中的每个int
都将设置为defaultValue
。如果defaultValue
为1,数组将充满1defaultValue
共256个,提供了一个满256个的数组
就速度而言,这可能无关紧要。如今,以字节读取或写入内存是一种罕见的现象。一次写入整个int
s可能会更快。但是一个好的memset
实现知道这一点,并将利用它。如果没有,编译器可能会。对于普通类型,fill\n
可能会导致类似于memset
的操作,而对于其他类型,memset
将无法将对象复制到位。我坚持用填充。这两种方法都适用。这取决于你真正想做什么memset
处理字节,因此-1写入int
s数组中的每个字节。对于-1来说这是可以的,因为-1的4个字节与设置为-1的int
具有相同的位模式。用1试试看,假设32位int
,你会得到一个满是16843009(0x01010101)的数组。关于编辑和我上面的评论,如果你想让数组中的每个int
都有defaultValue
作为默认值,那么fill\n
似乎是唯一的选项。还可以考虑如果<代码> Debug值太大,不能适应一个字节。在这种情况下,code>memset
是完全无用的,因为它“将给定值缩减为一个无符号字符
。尽管如此,您的观点非常有趣,您可以将其添加到您的(正式)回答中,对于琐碎的类型,fill\n
可能会导致类似于memset
的操作,memset
将无法将对象复制到位。我坚持用填充。这两种方法都适用。这取决于你真正想做什么memset
处理字节,因此-1写入int
s数组中的每个字节。对于-1来说这是可以的,因为-1的4个字节与设置为-1的int
具有相同的位模式。用1试试看,假设32位int
,你会得到一个满是16843009(0x01010101)的数组。关于编辑和我上面的评论,如果你想让数组中的每个int
都有defaultValue
作为默认值,那么fill\n
似乎是唯一的选项。也考虑一下如果