我需要移位字节缓冲区的内容。当然,我开始编写memcpy
,但后来意识到它可能有源{和}的restrict
说明符。我的实施(MSVC 2013)似乎没有它。 Cppreference列出了两个memcpy
版本,有和没有restrict
,但是我没有得到它 - 我不认为这些是重载,我不清楚编译器如何正确地确定哪一个挑。
另一方面,memcpy
函数可以在运行时分析地址和count
参数,以确定地址范围是否重叠。
那么,允许使用重叠参数调用memcpy
吗?如果没有,有没有办法执行比普通for
更好的操作?
答案 0 :(得分:5)
来自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。