代码之家  ›  专栏  ›  技术社区  ›  sharptooth

对于winapi结构,有什么理由更喜欢memset/zeromemory来进行值初始化?

  •  13
  • sharptooth  · 技术社区  · 15 年前

    在Win32编程中,使用了一些pod结构。这些结构通常需要在使用前归零。

    这可以通过拨打 memset() / ZeroMemory()

    STRUCT theStruct;
    ZeroMemory( &theStruct, sizeof( theStruct ) );
    

    或通过值初始化:

    STRUCT theStruct = {};
    

    虽然 the two variants above are not equivalent in general :

    • 不同对待填充
    • 不同对待非POD成员变量

    如果在win32中使用pod结构,它们看起来是等效的。

    有什么情况吗 MeMSET() / 零Ω() 应该使用win32 pod结构而不是值初始化?

    7 回复  |  直到 11 年前
        1
  •  22
  •   user180326    15 年前

    我总是使用:

    STRUCT theStruct = {}; // for C++, in C use {0}
    

    它较短,标准,因此更优雅,我不在乎理论上的差异。我们在讨论一个具体操作系统的代码。

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

    STRUCT theStruct = {sizeof(STRUCT)}; 
    

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

        2
  •  8
  •   Littm JessicaParker    13 年前

    在Win32中, ZeroMemory 只是一个宏 RtlZeroRemory ,这是memset的宏。所以,我认为这没什么区别。

    WinBase.h :

    \#define ZeroMemory RtlZeroMemory"
    

    WinNT.h :

    \#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
    
        3
  •  4
  •   Edward Brey    12 年前

    如果您的代码将作为一个例子,无数的Visual Basic开发人员可能不注意或理解C++ = {} 构造,ZrimeMeMe是使C++代码看起来更像伪代码的一种很好的方法,并将细微的、毛发撕开的初始化错误的发生率降到最低。

    这就是担心 MSDN article authors faced 这就解释了为什么零内存出现在这么多代码中(甚至C++代码)。

    另一方面,如果C++代码的目的是制造一个工作产品,而不是教世界,使用C++语言的优雅和表达能力是一个伟大的想法。

        4
  •  2
  •   Necrolis    15 年前

    (我可以预见)不使用值初始化进行“归零”的唯一原因是,如果您有 memset / ZeroMemory (例如基于SSE的),或者需要避免编译器出现问题(在这里引用MSVC,从VS2008开始) 清零 永远不会成为一个内在的,但是通过一些巧妙的编码(不使用asm),你可以强制内在的( REP STOS )

        5
  •  2
  •   AnT stands with Russia    15 年前

    唯一喜欢的理由 memset / ZeroMemory 对于这种初始化,如果winapi函数 需要/期待 以这种方式初始化的内存,即如果winapi函数期望它们的零是物理零-所有零位模式的值。

    请记住,某些类型的零值表示与物理全零位模式之间的区别取决于编译器的实现,而不是操作系统。理论上,Windows编译器可以使用非零位模式来表示各种类型的零值。比如,空指针可以用一些虚构的C或C++编译器的非零物理值来表示。(当然,没有人会这么做)。

        6
  •  1
  •   Marcelo Cantos    15 年前

    最终结果是相同的(只要你假设 0 is always represented by all-zero-bits ,所以这在很大程度上是一个风格问题。就个人而言,我更喜欢值初始化,因为它更简单,不需要函数调用。

    顺便说一下,您必须初始化至少一个成员:

    STRUCT theStruct = {0};
    

    省略 0 某些C编译器允许,但C标准不允许。C++允许省略,但我更喜欢只使用 .

        7
  •  -1
  •   vangodp    11 年前

    在C++ 11中:

    struct A {
        int x = 10;
        int y = 100;
        int z = 0;
    };
    

    旧式C++

    struct A {
        int x;
        int y;
        int z;
        A() : x( 10 ), y( 100 ), z( 0 ) {} //constructor
    };