【问题标题】:bzero() & bcopy() versus memset() & memcpy()bzero() & bcopy() 与 memset() 和 memcpy()
【发布时间】:2013-08-20 08:43:38
【问题描述】:

是否有任何理由在 Linux 环境中使用非标准的 bzero()bcopy() 而不是 memset()memcpy()?我听到很多人说它们更适合 Linux 编译器,但没有看到比标准函数有任何优势。

它们是否比标准的更优化,或者它们是否有任何偏好的行为特殊性?

【问题讨论】:

  • 只有一个地方bzeromemset“更好”:即使在每个参数都需要的架构上,你也可以从一个只需要两个参数的函数尾调用bzero一个堆栈槽。至于bcopy,我相信它类似于memmove,而不是memcpy
  • bcmp(), bcopy(), bzero(), ffs()推荐用于重视可移植性的新应用程序,它们仅用于 BSD 应用程序的可移植性。
  • @Grijesh 我知道他们在做什么,我想知道在更深层次上是否有什么特别之处

标签: c linux


【解决方案1】:

虽然 bzerobcopy 函数不是 ISO C(我假设您在将它们称为非标准时所说的实际标准),但它们是 POSIX标准的东西,尽管它们早于 ISO POSIX。

并注意使用“是”这个词 - 这些函数在 POSIX.1-2001 中已被弃用,并在 POSIX.1-2008 中最终删除,以尊重memset、@987654324 @ 和 memmove。所以你最好尽可能使用标准的 C 函数。

如果您有 很多 代码使用它们,并且您不想全部更改(尽管您可能在某些时候应该) ,您可以使用以下快速替换:

// void bzero(void *s, size_t n);
#define bzero(s, n) memset((s), 0, (n))

// void bcopy(const void *s1, void *s2, size_t n);
#define bcopy(s1, s2, n) memmove((s2), (s1), (n))

【讨论】:

    【解决方案2】:
    #include <strings.h>
    void bcopy(const void *src, void *dest, size_t n);
    

    说明 bcopy() 函数将 n 个字节从 src 复制到 dest。结果是正确的,即使两个区域重叠。

    符合: 4.3BSD,好像b来自BSD,好像被弃用了。

    这意味着bcopy 类似于memmove() 而不是memcpy(),正如 R.. 在他的评论中所说的那样。

    注意:strings.h 也不同于 string.h

    【讨论】:

    【解决方案3】:

    实际上,现在情况可能正好相反。您会看到,因为memcpymemset 包含在标准中,所以编译器将被允许假定调用的函数完全符合标准的规定。这意味着编译器可以用最有效的方式替换它们来执行它可以计算的操作。另一方面,对于 bcopybzero,标准没有规定任何行为,因此编译器不能假设任何事情 - 这意味着编译器需要发出实际的函数调用。

    但是,例如 GCC 知道 bcopybzero 是否是为具有它们的操作系统构建的。

    【讨论】:

    • 更准确地说,一些编译器(尤其是最新版本的GCC)可以以“神奇”的方式(符合标准)处理memcpymemsetmemcmp,例如使用 GCC builtins,并且可以特别优化它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2018-04-10
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2011-03-30
    • 2010-12-04
    相关资源
    最近更新 更多