这两个概念的含义不同.第一个使用memset
函数,其目的是set a buffer of memory to certain value.第二个是initialize an object.让我用一些代码来解释一下:
假设您有一个包含成员only of POD types的 struct ("纯旧数据"-参见What are POD types in C++?)
struct POD_OnlyStruct
{
int a;
char b;
};
POD_OnlyStruct t = {}; // OK
POD_OnlyStruct t;
memset(&t, 0, sizeof t); // OK as well
在这种情况下,写一个POD_OnlyStruct t = {}
或POD_OnlyStruct t; memset(&t, 0, sizeof t)
并没有多大区别,因为我们这里唯一的区别是在使用memset
的情况下,alignment字节被设置为零值.因为你不能正常访问这些字节,所以对你来说没有区别.
另一方面,既然你已经把你的问题标记为C++,我们来试试另一个例子,成员types different from POD:
struct TestStruct
{
int a;
std::string b;
};
TestStruct t = {}; // OK
{
TestStruct t1;
memset(&t1, 0, sizeof t1); // ruins member 'b' of our struct
} // Application crashes here
在这种情况下,使用像TestStruct t = {}
这样的表达式是好的,在上面使用memset
会导致崩溃.下面是使用memset
会发生的情况-创建了一个类型为TestStruct
的对象,因此创建了一个类型为std::string
的对象,因为它是我们 struct 的成员.接下来,memset
将对象b
所在的存储器设置为特定值,例如为零.现在,一旦我们的TestStruct对象超出范围,它将被销毁,当轮到它的成员std::string b
时,你会看到崩溃,因为该对象的所有内部 struct 都被memset
摧毁了.
所以,现实是,those things are very different,虽然在某些情况下,你有时需要将整个 struct 从memset
变为零,但确保你明白你在做什么,而不是像我们的第二个例子那样犯错误,这一点总是很重要的.
我的投票-如果需要,在对象only上使用memset
,在所有其他情况下使用default初始化x = {}
.