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

当内存集已经存在时,为什么会存在零内存等?

  •  22
  • CannibalSmith  · 技术社区  · 16 年前

    为什么 ZeroMemory() 当C标准库中已经存在memset和相关调用时,Windows API中是否存在类似的调用?我该打哪个电话?我猜答案是“视情况而定”。关于什么?

    8 回复  |  直到 7 年前
        1
  •  32
  •   In silico    16 年前

    在C和C++中, ZeroMemory() memset() 完全一样。

    /* In winnt.h */
    #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
    
    /* In winbase.h */
    #define ZeroMemory RtlZeroMemory
    

    为什么使用 零Ω() 那么呢? To make it obvious. 但我更喜欢 MeMSET() 在C或C++程序中。

        2
  •  11
  •   lornova    16 年前

    实际原因是,在不同的平台上,它可能以比 memset . 别忘了WindowsNT是作为一个高度可移植的操作系统设计的,它实际上运行在alpha、mips和power pc上。因此,如果foopc平台出现了,并且有一些组装方式可以将内存设置为零,那么它可以在不改变高级API的情况下实现。这在Windows中不再适用,因为现在它只支持x86和AMD64平台,但在Windows CE中仍然适用。

        3
  •  8
  •   Jerry Coffin    16 年前

    ZeroMemory 这也是WindowsAPI本身的一部分。 memset 是C标准库的一部分。

    对于典型的用户土地代码,我通常使用 清零 (或您选择的语言提供的同等语言)。如果您正在使用类似于 零内存 更具吸引力。因为您的代码无论如何都是在内核模式下执行的,所以您不需要花费任务切换来使用它。因为它已经在Windows代码中了,所以您没有在驱动程序中携带额外的代码来复制已经存在的代码。同时,您确实需要花费函数调用的成本,并且在case或zeroing(特别是一小部分)内存中,内联代码可能更快,并且 rep stosd 不需要太多的代码(实际上,设置和使用 雷斯托斯 可能需要更少的函数调用代码)。

        4
  •  6
  •   Humberto    16 年前

    因为Windows API应该是语言不可知论者。它为开发人员提供了足够的功能,不管他们使用什么语言。当然,最终许多函数将复制语言提供的现有功能。

    您应该调用winapi函数(和 宏指令 )当你需要某种程度的控制时——比较 fopen() 具有 CreateFile() 例如。否则,优先使用特定于语言的构造,而不是API调用。至少,您获得了更多的平台独立性。

        5
  •  3
  •   Paweł Sołtysiak    16 年前

    因为,零内存不需要注释行

        6
  •  3
  •   Andreas Rejbrand    16 年前

    我认为有一点是内存分配函数在所有的win32项目中都应该是相同的,与编程语言无关。实际上,正如前面所指出的,在C语言中,零内存实际上是memset,即C函数。在德尔福,

    procedure ZeroMemory(Destination: Pointer; Length: DWORD);
    begin
      FillChar(Destination^, Length, 0);
    end;
    

    其中fillchar是delphi函数。等等:

    procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
    begin
      Move(Source^, Destination^, Length);
    end;
    
    procedure FillMemory(Destination: Pointer; Length: DWORD; Fill: Byte);
    begin
      FillChar(Destination^, Length, Fill);
    end;
    
    ...
    
        7
  •  2
  •   richard.albury    13 年前

    事实上,你 希望 使用IS SecureZeroMemory() .

    优化编译器可以删除对 memset() 安全零内存() 旨在防止这种情况发生。

    我曾经认为 ZeroMemory() 在我遇到这个事实之前,没有必要打电话。

        8
  •  1
  •   Krumelur    16 年前

    根据 MSDN ,零内存是一个宏。它可能作为一种方便(例如命名约定)或向后兼容性而存在。