当前位置:  技术问答>linux和unix

我想来想去认为C99没有必要引进 restrict 关键字啊~ 请指点下.

    来源: 互联网  发布时间:2016-05-08

    本文导语:  首先, gcc似乎还不支持这个关键字. 我用的是gcc 4.1.2 C99标准说: 用restrict声时的指针表明该指针是访问数据的唯一且初始的方式。  我觉得没有必要引进restrict的理由是: 如果代码使用restrict关键字时违反了 "该...

首先, gcc似乎还不支持这个关键字. 我用的是gcc 4.1.2

C99标准说: 用restrict声时的指针表明该指针是访问数据的唯一且初始的方式。 

我觉得没有必要引进restrict的理由是:
如果代码使用restrict关键字时违反了 "该指针是访问数据的唯一且初始的方式" 规则会被编译器发现,并报错。 那么就不需要这个关键字,因为编译器有能力检查某个指针是否符合 "访问数据的唯一且初始的方式" 这个条件, 于是就可以自己决定优化.

如果编译器没有能力检查被restrict关键字声明的指针是否合法, 那么编译器就必須假设restrict指针符合条件,如果程序员犯错,那么程序就出错了.

想不明白 ! 你们看明白我的意思了吗? 请多多指点...


|
http://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html
http://www.devx.com/tips/Tip/13825

|
转一个,挺有意思

http://blog.csdn.net/lovekatherine/archive/2007/11/19/1891806.aspx

今天读APUE,看到某个函数原型的声明:

int stat (  const char * restrict  pathname,struct stat * restrict buf);

    

这里的restrict让我觉得有些疑惑,一查原来是C99中增加的关键字

那么restrict的意义是什么呢?

One of the new features in the recently approved C standard C99, is the restrict pointer qualifier. This qualifier can be applied to a data pointer to indicate that, during the scope of that pointer declaration, all data accessed through it will be accessed only through that pointer but not through any other pointer. The 'restrict' keyword thus enables the compiler to perform certain optimizations based on the premise that a given object cannot be changed through another pointer. Now you're probably asking yourself, "doesn't const already guarantee that?" No, it doesn't. The qualifier const ensures that a variable cannot be changed through a particular pointer. However, it's still possible to change the variable through a different pointer. 

概括的说,关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。

举个简单的例子

int foo (int* x, int* y)
...{
*x = 0;
*y = 1;
return *x;
}



很显然函数foo()的返回值是0,除非参数x和y的值相同。可以想象,99%的情况下该函数都会返回0而不是1。然而编译起必须保证生成100%正确的代码,因此,编译器不能将原有代码替换成下面的更优版本

int f (int* x, int* y)
...{
*x = 0;
*y = 1;
return 0;
}



啊哈,现在我们有了restrict这个关键字,就可以利用它来帮助编译器安全的进行代码优化了int f (int *restrict x, int *restrict y)...{*x = 0;*y = 1;return *x;}
此时,由于指针 x 是修改 *x的唯一途径,编译起可以确认 “*y=1; ”这行代码不会修改 *x的内容,因此可以安全的优化为


int f (int *restrict x, int *restrict y)
...{
*x = 0;
*y = 1;
return 0;
}



最后注意一点,restrict是C99中定义的关键字,C++目前并未引入;在GCC可通过使用参数" -std=c99"
来开启对C99的支持

|
我刚看这个关键字的功能的时候觉得是有用,仔细想了想好像真的是没什么用,好像就是为了优化的。

好像这种情况有用

int restrict *x = ...;
int *y = ...;
int *p;

*x += 9;
...
*y += 8;
...

...
*y *= 9;
...
*x -= 2;
好像能够将两句*x的操作合成一句。因为按设计,*x不能被其他访问方法改变,而y可能与另一个变量p指向同一个内容,所以不同的对y操作的语句不能合并。


|
据说

restrict的作用就是限制一个指针对一块内存的访问,进一步说就是如果一块内存区域通过一个受限制指针访问,那么它就不能通过另一个受限指针访问。引入restrict的目的是确保同一块内存上没有其它引用,让编译器更好地优化指令,生成更有效的汇编代码。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 感觉这儿不好,以后不想来了,全部分出让,谁要?
  • 想来北京的朋友请进!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3