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

cryincold 2008-02-13 01:11:42
首先, gcc似乎还不支持这个关键字. 我用的是gcc 4.1.2

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

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

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

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

...全文
584 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yang1032120121 2010-01-13
  • 打赏
  • 举报
回复
restrict只能优化指针!!和const不一样
davidtingle 2009-03-13
  • 打赏
  • 举报
回复
关注一下,我也有个相关的疑问,restrict char * xxx和char * restrict xxx这两种定义方式有什么区别?
cryincold 2008-02-14
  • 打赏
  • 举报
回复
55555 ~~~ 没人理解我的意思.

如果是那样的话,编译器有能力检测到其它指针没有指向 x 指向的内存, 那编译器可以自已决定优化了,为何还要程序员加个 restrict 关键字。 就像我上面做的试验, gcc 都没办法检查到程序员违返了restrict指针的使用(其它指针指向restrict指针指的内存了,gcc都没报错。显然是直接忽略了restrict关键字了)。

我的想法是。该不该优化,能不能优化应该是编译器的做的事情。 既然编译器都没办法判断程序员的给出的restrict建议是含正确, 那这个东西真是一点用都没有。
如果编译器能够检查出某个指针指的内存,其它指针都不指向它,那编译器就自已决定优化好了,根本无需这个多余的restrict.
用户 昵称 2008-02-14
  • 打赏
  • 举报
回复
我刚看这个关键字的功能的时候觉得是有用,仔细想了想好像真的是没什么用,好像就是为了优化的。

好像这种情况有用

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

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

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

cryincold 2008-02-13
  • 打赏
  • 举报
回复
gcc 貌似忽略了这个笨拙的新关键字.
cryincold 2008-02-13
  • 打赏
  • 举报
回复
to jennyvenus:

谢谢你的回复。我稍微修改了一下你给你函数做了个实验,结果验证了我的第二个猜测: 如果编译器没有能力检查被restrict关键字声明的指针是否合法, 那么编译器就必須假设restrict指针符合条件,如果程序员犯错,那么程序就出错了。

假设程序员不小心用另一个restrict指针或者一个普通指针指向了另一个restric指针.
int f(int *restrict x, int *restrict y)
{
int * p = x; // 一般的指针指向x指向的int
y = x; // 另一个受限指指也指向x指向的int
*x = 0;
*y = 98; // 用另一个受限指针修改x指向的int
*p = 99;
return *x;
}

可惜的是上面的代码在 gcc 4.1.2 下加参数 -std=c99 编译通过。编译器没有能力检查出程序员的错误。
如果编译器相信restrict x 指向的int不会被其它指针修改,那么显然优化成 return 0; 则是错的! 实验结果是编译器没有优化。 f返回了99.

这是编译器无法检查程序员是否正确使用restrict的情况。 另一种情况是编译器有能力检查到符合restrict的指针,那么就很奇怪了,既然编译器有能力检测到这种可以优化的指针为何还要程序员显示指示restrict呢???

blueflame 2008-02-13
  • 打赏
  • 举报
回复
http://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html
http://www.devx.com/tips/Tip/13825
blackbillow 2008-02-13
  • 打赏
  • 举报
回复
concern
用户 昵称 2008-02-13
  • 打赏
  • 举报
回复
转一个,挺有意思

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的支持
用户 昵称 2008-02-13
  • 打赏
  • 举报
回复
据说

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

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧