Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ fill\n vs memset设置数组的默认值_C++_Memset - Fatal编程技术网

C++ fill\n vs memset设置数组的默认值

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指向的对象的每个第一个计

我想知道如果要用默认值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指向的对象的每个第一个计数字符中。如果对象是可能重叠的子对象或不可平凡复制(例如,标量、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,数组将充满1
defaultValue
共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,数组将充满1
defaultValue
共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
似乎是唯一的选项。也考虑一下如果