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

Can*_*ith 25 c c++ windows winapi memset

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

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++程序.

  • @ richard.albury在这种情况下你应该使用SecureZeroMemory,因为ZeroMemory可以被优化掉. (5认同)
  • 这是一个更大的问题,正如我在回答中提到的:优化编译器可以删除对`memset()`的调用,所以你真的想要使用一些不会被优化的东西. (2认同)
  • @ya23我讨厌说“好吧,实际上”,但这正是我在回答中所说的。;-) (2认同)

lor*_*ova 11

实际的原因是,在不同的平台上,它可能以更有效的方式实现memset.不要忘记,Windows NT被设计为高度可移植的操作系统,它实际上运行在Alpha,MIPS和Power PC上.因此,如果fooPC平台问世并且有一些超快设置内存的汇编方式为零,则可以在不更改高级API的情况下实现.Windows不再适用,因为现在它只支持x86和amd64平台,但对于Windows CE仍然如此.


Jer*_*fin 8

ZeroMemory这些是Windows API本身的一部分.memset是C标准库的一部分.

对于典型的用户态代码,我通常会使用memset(或者您选择的语言提供的等效代码).如果你正在使用ZeroMemory更有吸引力的东西编写内核代码(例如,设备驱动程序).由于您的代码无论如何都以内核模式执行,因此您不需要花费任务开关来使用它.由于它已经在Windows代码中,因此您不会在驱动程序中携带额外的代码来复制已存在的代码.同时,您确实会产生函数调用的成本,并且在内存或归零(尤其是小块)内存中,内联代码可能会明显更快,而且rep stosd代码不需要太多(事实上,设置up和using rep stosd可能需要较少的函数调用代码.


Hum*_*rto 6

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

你应该调用WINAPI函数(直接)时,你需要控制在一定水平-比较fopen()CreateFile()例如.否则,更喜欢API调用的特定于语言的构造.至少,您获得了更多的平台独立性.

  • 我不确定你会怎么写一个与语言无关的宏. (3认同)

Paw*_*iak 5

因为,ZeroMemory 不需要注释行


ric*_*ury 5

实际上,您使用的是SecureZeroMemory().

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

ZeroMemory()在我发现这个事实之前,我曾经认为这些电话是不必要的。