既然已经有了 memset 等,为什么还存在 ZeroMemory 等?

新手上路,请多包涵

为什么 ZeroMemory() 以及在 C 标准库中已经存在 memset 和相关调用时 Windows API 中存在类似调用?我应该打电话给哪些?我猜答案是“取决于”。什么?

原文由 CannibalSmith 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

在 C 和 C++ 中, ZeroMemory()memset() 是完全相同的东西。

 /* In winnt.h */
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))

/* In winbase.h */
#define ZeroMemory RtlZeroMemory

那为什么要使用 ZeroMemory() 呢? 让它显而易见。 但我更喜欢 memset() 在 C 或 C++ 程序中。

原文由 In silico 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

对于典型的用户态代码,我通常会使用 memset (或您选择的语言提供的等价物)。如果您正在使用类似 ZeroMemory 的方式编写内核代码(例如,设备驱动程序),则更具吸引力。由于您的代码无论如何都在内核模式下执行,因此您不会产生使用它的任务切换成本。由于它已经在 Windows 代码中,因此您无需在驱动程序中携带额外的代码来复制已经存在的内容。同时,您确实会产生函数调用的成本,并且在将内存归零(尤其是一小块)的情况下,内联代码可能会明显更快,并且 rep stosd 不需要很多代码(事实上,设置和使用 rep stosd 可能比函数调用需要更少的代码)。

原文由 Jerry Coffin 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题