restrict解决的问题是潜在别名阻止了优化。如果翻译器不能确定两个不同的指针指向的是不同的对象,那么它就不能应用某些优化,例如它不能把对象的值放在寄存器中,而是放在内存中,也不能重新安排这两个指针装载和存储值的顺序。因为两个指针可能指向同一个对象。这个问题影响大数组上执行的算术运算,通过比较一个使用指针的程序和一个使用文件域数组的程序可以衡量这个影响。在有向量处理器的系统上数组版本可能快数十倍。
restrict限定符用来传递和扩展语言中已经指明了的两种类型的别名信息。首先,如果一个指针得到了malloc的返回值,则该指针是这块已分配对象的唯一初始访问方式,其它指针只能只能通过得到该指针的值来访问这段空间。声明这个指针为restrict就把上述信息传递给了翻译器。此外,还可以用restrict把翻译器对这种指针的特殊处理扩展到更一般的情形。例如,可能在另一个函数中调用malloc,从而翻译器并不知情。或者单次调用malloc可能分配多个对象,每个对象通过自己的指针引用。
其次,库给出对象拷贝函数的两个版本,因为很多系统上如果知道源和目的数组不重叠则拷贝会更快。restrict可以表示对重叠的限制。
void *memcpy(void* restrict s1, const void* restrict s2, size_t n);
void* *memmove(void* s1, const void* s2, size_t n);
这种限制显式传给翻译器,则C库memcpy的直接实现可以给出以前需要汇编或其他非标准方法才能达到的性能。
翻译器可以假定文件域restrict指针是访问对象的唯一初始方法,就像它是数组名一样。这对于动态分配的内存很有用。
如果函数参数是restrict指针,则翻译器可以假定在函数每次开始执行时,该指针是访问对象的唯一方法。注意这个假设在函数每次执行完毕后就失效了。
翻译器可以假定块作用域中声明的restrict指针在块每次执行期间是访问对象的唯一初始方法。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8182517/viewspace-663965/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8182517/viewspace-663965/