为什么存在memset等时存在ZeroMemory等?

时间:2010-06-14 15:04:56

标签: c++ c windows winapi memset

为什么在C标准库中存在memset和相关调用时,Windows API中存在ZeroMemory()和类似调用?我应该打电话给哪些人?我猜可以回答“依赖”。什么?

8 个答案:

答案 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是一个宏。它可能是为了方便(例如,命名约定)或向后兼容而存在。