为什么当memset等已经有ZeroMemory等存在?

为什么在C标准库中有memset和相关的调用时,WindowsMemory中存在ZeroMemory和类似的调用? 我应该打给谁? 我可以猜到答案是“依赖”。 什么?

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

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

为什么使用ZeroMemory()呢? 为了显而易见。 但是我更喜欢C或C ++程序中的memset()

实际的原因是,在不同的平台上,它可能比memset更有效地实现。 不要忘记,Windows NT被设计成一个高度可移植的操作系统,它实际上运行在Alpha,MIPS和Power PC上。 因此,如果fooPC平台出来,并有一些组装方式,超快速设置内存为零,它可以实现而不改变高层次的API。 这对于Windows来说已经不再适用了,因为现在它只支持x86和amd64平台,但是对于Windows CE来说,它仍然是正确的。

ZeroMemory等都是Windows API本身的一部分。 memset是C标准库的一部分。

对于典型的用户级代码,我通常使用memset (或您选择的语言提供的等效项)。 如果你正在编写内核代码(例如,设备驱动程序),使用像ZeroMemory这样的东西更具吸引力。 由于您的代码无论如何都是在内核模式下执行的,因此您不需要花费任何开关来使用它。 由于它已经在Windows代码中,所以您不必在驱动程序中携带额外的代码来复制已经存在的代码。 与此同时,你的确承担了一个函数调用的代价,在这种情况下,或者调零(尤其是一小块)的内存,内联代码可能会快得多,而且代码不会占用很多代码,设置和使用rep stosd可能需要更少的代码,一个函数调用)。

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

你应该直接调用winapi函数(和 ),只要你需要一定的控制级别 – 例如比较fopen()CreateFile() 。 否则,首选API调用的语言特定的结构。 至少,你获得更多的平台独立性。

因为,ZeroMemory不需要评论

我认为有一点是内存分配函数应该在所有的Win32项目中都是相同的,而不依赖于编程语言。 事实上,正如前面已经指出的那样,在C中,ZeroMemory实际上是memset的C函数。 在Delphi中,

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

其中FillChar是德尔福功能。 等等:

 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; ... 

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

其实,你使用的是SecureZeroMemory()

优化编译器可以删除对memset()调用, SecureZeroMemory()旨在防止这种情况。

我曾经认为ZeroMemory()调用是没有必要的,直到我遇到这个事实。