【问题标题】:What's the difference between memmove and bcopy?memmove 和 bcopy 有什么区别?
【发布时间】:2021-04-11 12:41:49
【问题描述】:

我了解memcpy 和memmove 之间的区别:memmove 处理src 和dst 的重叠。我检查了man page for bcopy,它似乎也可以处理重叠。所以我想知道memmove和bcopy之间有什么区别吗?

【问题讨论】:

  • 此函数已弃用(在 POSIX.1-2001 中标记为 LEGACY):在新程序中使用 memcpy(3) 或 memmove(3)。
  • 我注意到 memove 和 memcpy 是 C 标准库的一部分,但 bcopy 是特定于 POSIX 的,因此它在 Windows 等非 POSIX 平台上不可用。
  • 您仍然会在旧代码中找到bcopy、bzero 等。 (尤其是出于某种原因的网络代码)。那些已经过去了 Dodo 的方式,现在应该使用 mem...() 函数。

标签: c memmove


【解决方案1】:

bcopy 和 memmove 做同样的事情。但是,它们以不同的顺序接受参数:bcopy(src, dest, n) 与 memmove(dest, src, n)。所以它们不能是同一个函数的两个名字。

从历史上看,bcopy 是两者中较老的一个;如果没记错的话,它存在于 3BSD 中。 memmove 是 C 委员会在 1988 年左右发明的。

新代码应使用 memmove,因为它是 C 标准所要求的,因此比 bcopy 更可移植。

【讨论】:

    【解决方案2】:

    主要区别通常来自它们的起源。 bcopy 来自 Berkeley Source Distribution (BSD) 系统,而memcpy 及其家族主要来自 AT&T 的 System V。最后,通过遵守遗留代码,所有这些功能都包含在标准中。

    Richard Steven 的书"UNIX network programming" 中对memset 与bzero 的使用有很好的解释,这在一定程度上解释了两者的使用。

    今天的实现只是解决调用相同的内部实现,但同时提供两个接口。

    【讨论】:

      【解决方案3】:

      在功能上它们是等价的。区别在于便携性。 memmove 是 C 标准的一部分,而 bcopy 是 POSIX 的一部分,因此移植性较差。

      bcopy 已弃用。手册页说:

      此函数已弃用(在 POSIX.1-2001 中标记为 LEGACY):在新程序中使用 memcpy(3) 或 memmove(3)。请注意,前两个参数对于memcpy(3) 和memmove(3) 是互换的。 POSIX.1-2008 移除了bcopy() 的规范。

      【讨论】:

        猜你喜欢
        • 2010-11-15
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        相关资源
        最近更新 更多