为什么在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()
调用是没有必要的,直到我遇到这个事实。