【问题标题】:Is it allowed for src and dest arguments of memcpy to overlap?memcpy 的 src 和 dest 参数是否允许重叠?
【发布时间】:2016-03-03 09:35:21
【问题描述】:

我需要移动字节缓冲区的内容。自然地,我开始写memcpy,但后来意识到它可能有restrict 说明源和目标。我的实现(MSVC 2013)似乎没有。 Cppreference 列出了两个memcpy 版本,有和没有restrict,但我不明白——我不认为这些是重载,而且我不清楚编译器如何正确确定选择哪一个。 另一方面,memcpy 函数可以在运行时分析地址和count 参数以确定地址范围是否重叠。

那么,是否允许使用重叠参数调用memcpy?如果没有,有没有比普通for更好的方法来执行这个操作?

【问题讨论】:

  • memcpy 的文档非常明确,不是吗?

标签: c++ memcpy


【解决方案1】:

没有it is not,你应该使用memmove

来自memcpy(3)

memcpy() 函数将 n 个字节从内存区域 src 复制到内存区域 dest。内存区域不得重叠。如果内存区域确实重叠,请使用 memmove(3)。

来自memmove(3)

memmove() 函数将 n 个字节从内存区域 src 复制到内存区域 dest。内存区域可能重叠:复制就像首先将 src 中的字节复制到不与 src 或 dest 重叠的临时数组中一样,然后将字节从临时数组复制到 dest。

restrict 关键字是在 C99 标准中添加的,这就是为什么cppreference 列出了两个版本(如果你仔细看右边,你可以看到until C99since C99)。

【讨论】:

    【解决方案2】:

    memcpy 中的内存不能重叠,否则您将面临未定义行为的风险。

    改用 memmove。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-10
      • 2019-07-24
      • 2011-01-24
      • 1970-01-01
      • 2015-10-08
      • 2023-04-05
      相关资源
      最近更新 更多