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

Vio*_*ffe 0 c++ memcpy

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

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

Hol*_*olt 5

,不是,你应该使用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).