restrict关键字
2013-08-23 21:31
232 查看
APUE中经常能看到指针参数加上了restrict关键字。今天百度了下,到底有什么作用。
的出现是因为 C 语言本身固有的缺陷,C 程序员应当主动地规避这个缺陷,而编译器也会很配合地优化你的代码.
3.C库中的例子
这两个函数均从s2指向的位置复制n字节数据到s1指向的位置,且均返回s1的值。两者之间的差别由关键字restrict造成,即memcpy()可以假定两个内存区域没有重叠。memmove()函数则不做这个假定,因此,复制过程类似于首先将所有字节复制到一个临时缓冲区,然后再复制到最终目的地。如果两个区域存在重叠时使用memcpy()会怎样?其行为是不可预知的,既可以正常工作,也可能失败。在不应该使用memcpy()时,编译器不会禁止使用memcpy()。因此,使用memcpy()时,您必须确保没有重叠区域。这是程序员的任务的一部分。关键字restrict有两个读者。一个是编译器,它告诉编译器可以自由地做一些有关优化的假定。另一个读者是用户,他告诉用户仅使用满足restrict要求的参数。一般,编译器无法检查您是否遵循了这一限制,如果您蔑视它也就是在让自己冒险。
1.简介
restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针。restrict的出现是因为 C 语言本身固有的缺陷,C 程序员应当主动地规避这个缺陷,而编译器也会很配合地优化你的代码.
2.例子
考虑下面的例子:int ar[10]; int * restrict restar=(int *)malloc(10*sizeof(int)); int *par=ar; //这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。那么: for(n=0;n<10;n++) { par +=5; restar +=5; ar *=2; par +=3; restar +=3; } //因为restar是访问分配的内存的唯一且初始的方式,那么编译器可以将上述对restar的操作进行优化: //restar +=8; //而par并不是访问数组ar的唯一方式,因此并不能进行如上的优化。 //使用了关键字restrict,编译器就可以放心地进行优化了。 //优化后的结果: for(n=0;n<10;n++) { par +=5; ar *=2; par +=3; restar +=8; }
3.C库中的例子
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()时,您必须确保没有重叠区域。这是程序员的任务的一部分。关键字restrict有两个读者。一个是编译器,它告诉编译器可以自由地做一些有关优化的假定。另一个读者是用户,他告诉用户仅使用满足restrict要求的参数。一般,编译器无法检查您是否遵循了这一限制,如果您蔑视它也就是在让自己冒险。
相关文章推荐
- restrict关键字
- C/C++ 中的特殊关键字:volatile, register, restrict, __attribute__
- C 语言restrict 关键字的使用浅谈
- C99中的restrict关键字
- C语言中restrict关键字学习
- 关于volatile和restrict关键字
- 关键字restrict
- C语言中关键字restrict的用法(linux 为 __restrict)
- extern、static、restrict、volatile 关键字
- 关键字Restrict
- C99中的restrict和C89的volatile关键字
- C++ restrict关键字
- C语言restrict关键字的使用
- c语言中restrict关键字的理解
- [zz]C语言的5种存储类以及关键字volatile、restrict
- c99关键字restrict
- restrict关键字用法
- 函数原型中的restrict关键字
- 【转】C语言中的restrict关键字
- C语言中restrict关键字学习 http://blog.csdn.net/llf021421/article/details/8092602