有没有理由更喜欢memset/ZeroMemory来为WinAPI结构初始化值?

sha*_*oth 14 c c++ winapi struct initialization

在Win32编程中,使用了一些POD结构.这些结构通常需要在使用前清零.

这可以通过调用memset()/ 来完成ZeroMemory()

STRUCT theStruct;
ZeroMemory( &theStruct, sizeof( theStruct ) );
Run Code Online (Sandbox Code Playgroud)

或者通过值初始化:

STRUCT theStruct = {};
Run Code Online (Sandbox Code Playgroud)

虽然上面的两个变体通常不相同:

  • 不同地对待填充
  • 以不同方式处理非POD成员变量

在Win32中使用的POD结构的情况下,它们看起来相同.

是否有任何情况何时memset()/ ZeroMemory()应该使用Win32 POD结构而不是值初始化?

小智 23

我一直用:

STRUCT theStruct = {}; // for C++, in C use {0}
Run Code Online (Sandbox Code Playgroud)

它更短,更标准,因此更优雅,我并不真正关心理论上的差异.我们在这里讨论具体操作系统的代码.

另一个优点是你也可以在第一个成员中立即设置结构大小,如下所示:

STRUCT theStruct = {sizeof(STRUCT)}; 
Run Code Online (Sandbox Code Playgroud)

许多Win32结构要求您在第一个成员中设置大小.

  • 值得注意的是OP标记了C和C++的问题,但是`STRUCT theStruct = {};`是**无效的C**.你需要`{0}`. (4认同)

小智 10

在Win32中,ZeroMemory只是一个宏周围RtlZeroRemory,这是一个memset的宏.所以,我不认为它有所作为.

WinBase.h:

\#define ZeroMemory RtlZeroMemory"
Run Code Online (Sandbox Code Playgroud)

WinNT.h:

\#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
Run Code Online (Sandbox Code Playgroud)

  • 问题是这些中的任何一个是否与`= {}`不同 (2认同)

Edw*_*rey 5

如果您的代码将作为无数可能不会注意到或理解 C++= {}构造的 Visual Basic 开发人员的示例,ZeroMemory 是一个好方法,可以使 C++ 代码看起来更像伪代码,并最大限度地减少微妙的、令人毛骨悚然的初始化的发生率错误。

这是MSDN 文章作者所面临的担忧,这也解释了为什么 ZeroMemory 出现在如此多的代码(甚至 C++ 代码)中。

另一方面,如果 C++ 代码的目的是制作一个可用的产品,而不是教导世界,那么使用 C++ 语言的优雅和表达能力是一个好主意。