我想看看是否restrict
会阻止memcpy
访问重叠的内存。
该memcpy
函数将n个字节从内存区 src直接复制到内存区 dest 。内存区域不应重叠。memmove
使用缓冲区,因此没有重叠内存的风险。
限定符表示在指针的restrict
生命周期内,只有指针本身或直接来自它的值(例如pointer + n
)才能访问该对象的数据。如果不遵循意图声明并且通过独立指针访问对象,这将导致未定义的行为。
#include <stdio.h>
#include <string.h>
#define SIZE 30
int main ()
{
char *restrict itself;
itself = malloc(SIZE);
strcpy(itself, "Does restrict stop undefined behavior?");
printf("%d\n", &itself);
memcpy(itself, itself, SIZE);
puts(itself);
printf("%d\n", &itself);
memcpy(itself-14, itself, SIZE); //intentionally trying to access restricted memory
puts(itself);
printf("%d\n", &itself);
return (0);
}
输出 ()
自身地址:12345
限制是否停止未定义的行为?
自身地址:12345
停止未定义的 bop 未定义行为?
自身地址:12345
是否memcpy
使用独立指针?因为输出肯定会显示未定义的行为,restrict
并且不会阻止使用memcpy
.
我假设memcpy
它具有性能优势,因为它在memmove
使用缓冲区时直接复制数据。但是对于现代计算机,我是否应该忽略这种潜在的更好性能并始终使用它,memmove
因为它保证没有重叠?