今天要使用stat 函数时,看到stat 函数的定义中有restrict ,不解,于是上网查了一下。
restrict 是C99中引入的,它的作用就是限制与约束指针。表明指针 是访问这个数据对你唯一且初始的方式。即如果 要改变一个restrict修饰的 指针指向的内容,只能通过这个指针,不能通过其它的方法完成。
帮助编译器进行更好的优化代码,生成更有效率的汇编代码.
关键字restrict有两个读者。一个是编译器,它告诉编译器可以自由地做一些有关优化的假定。另一个读者是用户,他告诉用户仅使用满足restrict要求的参数。一般,编译器无法检查您是否遵循了这一限制,如果您蔑视它也就是在让自己冒险。
C库中有两个函数可以从一个位置把字节复制到另一个位置。在
C99标准下,它们的原型如下:
void * memcpy(void * restrict s1, const void * restrict s2, size_t n);
void * memove(void * s1, const void * s2, size_t n);
这两个函数均从s2指向的位置复制n字节数据到s1指向的位置,且均返回s1的值。两者之间的差别由
关键字restrict造成,即memcpy()可以假定两个内存区域没有重叠。memmove()函数则不做这个假定,因此,复制过程类似于首先将所有字节复制到一个临时缓冲区,然后再复制到最终目的地。如果两个区域存在重叠时使用memcpy()会怎样?其行为是不可预知的,既可以正常工作,也可能失败。在不应该使用memcpy()时,编译器不会禁止使用memcpy()。因此,使用memcpy()时,您必须确保没有重叠区域。这是程序员的任务的一部分。