这两个结构在含义上有很大不同。第一个使用一个memset
函数,该函数旨在将内存缓冲区设置为某个值。第二个初始化一个对象。让我用一些代码来解释一下:
假设您有一个仅包含POD类型成员的结构(“普通旧数据”-请参阅C ++中的POD类型是什么?)
struct POD_OnlyStruct
{
int a;
char b;
};
POD_OnlyStruct t = {};
POD_OnlyStruct t;
memset(&t, 0, sizeof t);
在这种情况下,写aPOD_OnlyStruct t = {}
或POD_OnlyStruct t; memset(&t, 0, sizeof t)
没有什么区别,因为我们这里唯一的区别是在使用情况下将对齐字节设置为零值memset
。由于您通常无法访问这些字节,因此没有任何区别。
另一方面,由于您已将问题标记为C ++,因此让我们尝试另一个示例,其成员类型不同于POD:
struct TestStruct
{
int a;
std::string b;
};
TestStruct t = {};
{
TestStruct t1;
memset(&t1, 0, sizeof t1);
}
在这种情况下,使用like这样的表达式TestStruct t = {}
会很好,而memset
在其上使用则会导致崩溃。如果您使用,就会发生以下情况memset
-TestStruct
创建了一个类型的对象,因此创建了一个类型的对象std::string
,因为它是我们结构的成员。接下来,memset
将对象所在的内存b
设置为某个值,例如零。现在,一旦我们的TestStruct对象超出范围,它就会被销毁,当轮到它的成员时,std::string b
您会看到崩溃,因为该对象的所有内部结构都被破坏了memset
。
因此,现实是,这些事情非常不同,尽管有时memset
在某些情况下您需要将整个结构归零,但确保您了解自己在做什么,而不是像我们在第二篇文章中那样犯错,始终很重要例。
我的投票-仅在需要时才memset
在对象上使用,在所有其他情况下都使用默认初始化。x = {}