gpt4 book ai didi

c++ - memset() 或值初始化以将结构清零?

转载 作者:IT老高 更新时间:2023-10-28 13:21:22 40 4
gpt4 key购买 nike

在 Win32 API 编程中,通常使用具有多个字段的 C struct。通常它们中只有几个具有有意义的值,而所有其他值都必须归零。这可以通过以下两种方式之一实现:

STRUCT theStruct;
memset( &theStruct, 0, sizeof( STRUCT ) );

STRUCT theStruct = {};

第二个变体看起来更干净 - 它是单行的,它没有任何可能输入错误并导致错误的参数。

与第一个变体相比,它有什么缺点吗?使用哪种变体?为什么?

最佳答案

这两个结构在含义上非常不同。第一个使用 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 字节在 的情况下被设置为零值使用 memset。由于您通常无法访问这些字节,因此对您来说没有区别。

另一方面,由于您已将问题标记为 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 归零,但始终重要的是确保您了解自己在做什么,并且不会像我们的第二个示例那样犯错误。

我的投票 - 如果需要,only 对对象使用 memset,并使用 default 初始化 x = {} 在所有其他情况下。

关于c++ - memset() 或值初始化以将结构清零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1998752/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com