免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5478 | 回复: 21

[C] 话说 restrict 是用来限制指针的,但是为什么不起作用呢? [复制链接]

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
发表于 2013-01-01 17:03 |显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. void fun(char* restrict p)
  5. {
  6.     char* tmp = p;
  7.     printf("%s\n", tmp);
  8. }

  9. int main()
  10. {
  11.     char* restrict p = malloc(10);
  12.     memset(p, 0, 10);
  13.     char* p2 = p;
  14.     sprintf(p, "hello");
  15.     printf("p: %s\n", p);
  16.     printf("p2: %s\n", p2);
  17.     printf("-------------------\n");

  18.     sprintf(p2, "world");
  19.     printf("p: %s\n", p);
  20.     printf("p2: %s\n", p2);
  21.    
  22.     printf("-------------------\n");
  23.     fun(p);

  24. }
复制代码
运行结果如下:
p: hello
p2: hello
-------------------
p: world
p2: world
-------------------
world

不是说经 restrict 限制后,告诉编译器 p 所指的内存区域只有 p 来修改么,怎么其他非 p 指针照样可以修改呢?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2013-01-01 17:12 |显示全部楼层
...

游客,如果您要查看本帖隐藏内容请回复


当然可以修改,restrict 只要方便优化而已。。。和volatile相反,像字符串这样的东西,一般是看不出结果的。
要试试简单的可以直接保存在寄存器中的数据。

就算如此,也不能保证成功演示。谁知道编译器如何缓存数据啊

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
发表于 2013-01-01 17:57 |显示全部楼层
回复 2# folklore
  1. int main()
  2. {
  3.     int* p = malloc(sizeof(int));
  4.     *p = 100;
  5.     int* np = p;
  6.     *np += 100;
  7.     printf("*p %d\n", *p);
  8.     *p -= 50;
  9.     printf("*p %d\n", *p);
  10.     printf("*np %d\n", *np);

  11. }
复制代码
结果为:
*p 200
*p 150
*np 150
怎么没有把 *p = 100; 和 *p -= 50; 优化为 *p = 50;

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
发表于 2013-01-01 18:42 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2013-01-01 19:40 |显示全部楼层
restrict 是说给编译器和函数调用者的
编译器可以据此优化也可以不优化
函数调用者则应该保证没有重叠以免和编译器可能的优化相冲突

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
发表于 2013-01-02 01:28 |显示全部楼层
但是百科上说:int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针。
按照这种说法: int * ptr2 = ptr;
ptr2 是不能访问 ptr 所指的内存哦。
可是事与愿违,ptr2 还是能顺利的操作 ptr 所指的内存。
为什么呢?

论坛徽章:
0
发表于 2013-01-02 10:13 |显示全部楼层

论坛徽章:
0
发表于 2013-01-02 10:20 |显示全部楼层
你看的是什么百科?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
发表于 2013-01-02 10:47 |显示全部楼层
socay2 发表于 2013-01-02 01:28
但是百科上说:int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他 ...


这个道理太简单了,很多人总是不明白:

C的编译器只保证对的程序一定得出正确结果,不保证错的程序一定能跑出你设想的“错的”结果。

想明白这个问题,就不会问“这里写错了,怎么不出错”之类的问题了。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
发表于 2013-01-02 10:50 |显示全部楼层
另外,推荐看看这里:http://en.wikipedia.org/wiki/Restrict

这个关键字主要是方便优化,如果你没开优化,或者编译器没实现此类优化,那这个关键字起不到作用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP