是否允许memcpy的src和dest参数重叠?

时间:2016-03-03 09:35:21

标签: c++ memcpy

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

那么,允许使用重叠参数调用memcpy吗?如果没有,有没有办法执行比普通for更好的操作?

2 个答案:

答案 0 :(得分:5)

it is not,您应该使用memmove

来自memcpy(3)

  

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

来自memmove(3)

  

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

{C}标准中添加了restrict关键字,这就是cppreference列出两个版本的原因(如果您仔细查看右侧,则可以看到until C99和{{1} })。

答案 1 :(得分:1)

memcpy中的内存不能重叠,否则可能会导致未定义的行为。

改用memmove。