为什么在C标准库中存在memset和相关调用时,Windows API中存在ZeroMemory()
和类似调用?我应该打电话给哪些人?我猜可以回答“依赖”。什么?
答案 0 :(得分:34)
在C和C ++中,ZeroMemory()
和memset()
完全相同。
/* In winnt.h */
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
/* In winbase.h */
#define ZeroMemory RtlZeroMemory
为什么要使用ZeroMemory()
呢? To make it obvious.但我更喜欢C或C ++程序中的memset()
。
答案 1 :(得分:11)
实际原因是,在不同的平台上,它可能以比memset
更有效的方式实施。不要忘记,Windows NT被设计为高度可移植的操作系统,它实际上运行在Alpha,MIPS和Power PC上。因此,如果fooPC平台问世并且有一些超快设置内存的汇编方式为零,则可以在不更改高级API的情况下实现。 Windows不再适用,因为现在它只支持x86和amd64平台,但对于Windows CE仍然如此。
答案 2 :(得分:8)
ZeroMemory
等等是Windows API本身的一部分。 memset
是C标准库的一部分。
对于典型的用户态代码,我通常使用memset
(或您选择的语言提供的等效代码)。如果您使用类似ZeroMemory
的内容编写内核代码(例如,设备驱动程序)则更具吸引力。由于您的代码无论如何都以内核模式执行,因此您不需要花费任务开关来使用它。由于它已经在Windows代码中,因此您不会在驱动程序中携带额外的代码来复制已存在的代码。同时,您确实会产生函数调用的成本,并且在内存或归零(尤其是小块)内存中,内联代码可能会明显更快,并且rep stosd
不会占用太多代码(实际上,设置和使用rep stosd
可能会占用较少的函数调用代码。)
答案 3 :(得分:6)
因为Windows API应该与语言无关。它为开发人员提供了足够的功能,无论他们使用何种语言。当然,最终许多功能将复制语言提供的现有功能。
您需要在需要一定程度的控制时直接调用winapi函数(和宏) - 例如,将fopen()
与CreateFile()
进行比较。否则,更喜欢API调用的特定于语言的构造。至少,你获得了更多的平台独立性。
答案 4 :(得分:3)
因为,ZeroMemory不需要评论行
答案 5 :(得分:3)
我认为有一点是内存分配函数在所有Win32项目中都应该看起来一样,与编程语言无关。实际上,正如之前已经指出的那样,在C中,ZeroMemory实际上是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;
...
答案 6 :(得分:2)
实际上,您想要使用的是SecureZeroMemory()
。
优化编译器可以删除对memset()
的调用,而SecureZeroMemory()
旨在防止这种情况发生。
我曾经认为ZeroMemory()
电话是不必要的,直到我遇到这个事实。
答案 7 :(得分:1)
根据MSDN,ZeroMemory是一个宏。它可能是为了方便(例如,命名约定)或向后兼容而存在。