免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: smalloc
打印 上一主题 下一主题

C语言标准有没有规定前一个语句必须在后一个语句之前完成? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-10-18 09:50 |只看该作者

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
22 [报告]
发表于 2011-10-18 13:05 |只看该作者
本帖最后由 cjaizss 于 2011-10-18 13:07 编辑
真的是越来越不会写程序了。
smalloc 发表于 2011-10-17 16:04



    逻辑上必须如此!优化后不得违反逻辑上的语意.如果你想让你的程序现实中必须按照原来的顺序走,那么请加volatile

论坛徽章:
0
23 [报告]
发表于 2011-10-18 14:38 |只看该作者
本帖最后由 狗蛋 于 2011-10-18 14:42 编辑

这个其实就是鸭子哲学:一个动物,如果它看起来像鸭子,叫起来也像鸭子,那么就不妨先把它当鸭子。

C语言不管你后台如何实现,但最终结果,必须和按顺序执行每一条语句所达到的结果一致:也就是说,不管你后面如何捣蛋,结果像顺序执行的就行了。



这种哲学给了编译器/CPU广阔的优化余地,正如之前网友讨论的:
int i=0;
i=1;
可能会直接被编译器删除把i赋值为0的操作;

我之前也多次提到过常量优化,如:
int i=42;
int j=max(i, 99); //1
....  //其它乱七八糟一大陀子,用到了i但没用到j
.... //2 使用j的值

其中,//1处的max(i, 99)的声明如果是max(const int, const int),那么这个max函数调用可能就不会执行,直到//2位置才会真正执行(当然,如果前面就return回去了,那么就永远不执行它)。

同理,如果//1后面没有修改i,那么引用到i的地方也全都可以直接用立即数42代替,直到i被修改或有可能被修改的那一行为止。


换言之,c语言不阻止编译器从整体上揣摩代码功能,并据此调整代码执行次序甚至删除无效代码,只要最终结果和“代码按顺序执行”时一致即可。


不过,在多线程情况下,这种优化可能造成问题。
因为在线程A中不会修改的变量,可能在线程B中被频繁改变。这样,仅仅分析一个局部的代码块是不足以做出正确优化的。

遇到这种情况,可以用volatile修饰被影响的数据,告诉编译器这个数据会被其它代码修改/读取,就可以阻止这种“常量优化”。
这样才能保证多线程环境下优化过的程序执行结果,和按行顺序执行的结果一致。

形象点说,本来一个动物看起来像鸭子、叫起来像鸭子已经足够了;但由于多线程概念的出现,我们又需要它下鸭蛋了——volatile就是通知编译器这个的:喂,老兄,上面这次连鸭蛋也要检查,你别露馅了!

论坛徽章:
0
24 [报告]
发表于 2011-10-18 14:45 |只看该作者
本帖最后由 三月廿七 于 2011-10-18 14:52 编辑
这个其实就是鸭子哲学:一个动物,如果它看起来像鸭子,叫起来也像鸭子,那么就不妨先把它当鸭子。

C语言 ...
狗蛋 发表于 2011-10-18 14:38


请教一下,多线程需要看些什么书啊,  比较守护线程之类的...
多线程是我的一个盲点...

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
25 [报告]
发表于 2011-10-18 14:51 |只看该作者
本帖最后由 zylthinking 于 2011-10-18 14:52 编辑
逻辑上必须如此!优化后不得违反逻辑上的语意.如果你想让你的程序现实中必须按照原来的顺序走,那么 ...
cjaizss 发表于 2011-10-18 13:05


据我分析, volatile 未必能够防止这个问题, 自然我这个也是揣摩, 正在求证呢, 具体见: http://bbs.chinaunix.net/redirec ... 38&ptid=3606534

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
26 [报告]
发表于 2011-10-18 14:59 |只看该作者
据我分析, volatile 未必能够防止这个问题, 自然我这个也是揣摩, 正在求证呢, 具体见:
zylthinking 发表于 2011-10-18 14:51



    一定可以

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
27 [报告]
发表于 2011-10-18 15:02 |只看该作者
回复 14# zylthinking

其实我很理解……
因为我自己有时候就会这样……  比如在批评java时、批评oo时……

心里知道是矫枉过正,知道这些个东西并不是一无是处,但不批到一钱不值不够痛快啊!
而且我也不喜欢那种套话,或者说辩证分析?
帖子就这么大块地儿,又不是写论文。
写长了没处放也没人有耐心看啊……

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
28 [报告]
发表于 2011-10-18 15:09 |只看该作者
一定可以
cjaizss 发表于 2011-10-18 14:59


why?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
29 [报告]
发表于 2011-10-18 15:12 |只看该作者
why?
zylthinking 发表于 2011-10-18 15:09



    行规

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
30 [报告]
发表于 2011-10-18 15:13 |只看该作者
回复  zylthinking

其实我很理解……
因为我自己有时候就会这样……  比如在批评java时、批评oo时…… ...
OwnWaterloo 发表于 2011-10-18 15:02


他不仅仅是矫枉过正了, 有误导人之嫌。。。。。。。自然这是我的感觉。
算了, 最多不搭理他了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP