这两个结构的含义非常不同。第一个使用memset 函数,该函数旨在将内存缓冲区设置为某个值。第二个初始化对象。让我用一点代码解释一下:
假设您的结构只有 POD 类型的成员(“Plain Old Data” - 请参阅 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) 并没有太大区别,因为我们这里唯一的区别是 alignment 字节在 @ 的情况下被设置为零值987654327@ 已使用。由于您通常无法访问这些字节,因此对您来说没有区别。
另一方面,由于您已将问题标记为 C++,让我们尝试另一个示例,其中成员 类型不同于 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 类型的对象,因为它是我们结构的成员。接下来,memset 将对象b 所在的内存设置为某个值,比如零。现在,一旦我们的 TestStruct 对象超出范围,它将被销毁,当轮到它的成员 std::string b 时,您会看到崩溃,因为该对象的所有内部结构都被 memset 破坏了。
所以,现实情况是,那些事情是非常不同的,尽管在某些情况下您有时需要将整个结构 memset 归零,但确保您了解您的内容始终很重要'正在做,而不是像我们的第二个例子那样犯错误。
我的投票 - 如果需要,仅对对象使用memset,在所有其他情况下使用默认初始化x = {}。