In *_*ico 35
在C和C++,ZeroMemory()并memset()有同样的事情.
/* In winnt.h */
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
/* In winbase.h */
#define ZeroMemory RtlZeroMemory
Run Code Online (Sandbox Code Playgroud)
为什么要用ZeroMemory()呢?显而易见.但我更喜欢memset()C或C++程序.
lor*_*ova 11
实际的原因是,在不同的平台上,它可能以更有效的方式实现memset.不要忘记,Windows NT被设计为高度可移植的操作系统,它实际上运行在Alpha,MIPS和Power PC上.因此,如果fooPC平台问世并且有一些超快设置内存的汇编方式为零,则可以在不更改高级API的情况下实现.Windows不再适用,因为现在它只支持x86和amd64平台,但对于Windows CE仍然如此.
ZeroMemory这些是Windows API本身的一部分.memset是C标准库的一部分.
对于典型的用户态代码,我通常会使用memset(或者您选择的语言提供的等效代码).如果你正在使用ZeroMemory更有吸引力的东西编写内核代码(例如,设备驱动程序).由于您的代码无论如何都以内核模式执行,因此您不需要花费任务开关来使用它.由于它已经在Windows代码中,因此您不会在驱动程序中携带额外的代码来复制已存在的代码.同时,您确实会产生函数调用的成本,并且在内存或归零(尤其是小块)内存中,内联代码可能会明显更快,而且rep stosd代码不需要太多(事实上,设置up和using rep stosd可能需要较少的函数调用代码.
因为Windows API应该与语言无关.它为开发人员提供了足够的功能,无论他们使用何种语言.当然,最终许多功能将复制语言提供的现有功能.
你应该调用WINAPI函数(宏直接)时,你需要控制在一定水平-比较fopen()有CreateFile()例如.否则,更喜欢API调用的特定于语言的构造.至少,您获得了更多的平台独立性.
实际上,您要使用的是SecureZeroMemory().
优化编译器可以删除对 的调用memset(),SecureZeroMemory()旨在防止这种情况发生。
ZeroMemory()在我发现这个事实之前,我曾经认为这些电话是不必要的。