打印

编译优化不是万能的

[复制链接]
4819|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wwwq|  楼主 | 2010-5-1 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有些朋友在使用keil或IAR编程时,喜欢设置优化,但实际中,优化的设置会使程序偏离你的设计思路,有时会导致整个软件的运行错误,因此最好的优化是用户在编程时,注意编程技巧,这样才不会使编译器的优化思路干扰了你的工作,一点感想,和同道讨论。
沙发
mcuisp| | 2010-5-1 17:19 | 只看该作者
写的程序不怕优化,才能算是合格的程序员。
就实践中我看到的情况,这样合格的程序员比例并不高,包括很多月薪过万的。

使用特权

评论回复
评分
参与人数 2威望 +6 收起 理由
machunshui + 1
谈的元 + 5
板凳
wwwq|  楼主 | 2010-5-1 18:01 | 只看该作者
楼上,估计你没看懂我的意思,优化中算**删除一些编译器认为无用的语句,这时未必是用户的真实意图所在,可以试试在文件的最后几行 声明一个变量,并赋值,这类语句基本被删除了。不存在合格不合格的问题,有用的且可靠的就是好的,合格的,请理性讨论!

使用特权

评论回复
地板
wwwq|  楼主 | 2010-5-1 18:01 | 只看该作者
**---算--法--没啥呀?

使用特权

评论回复
5
Simon21ic| | 2010-5-1 18:04 | 只看该作者
诶,都不让用中文了,以后都用英文吧

使用特权

评论回复
6
mohanwei| | 2010-5-1 19:46 | 只看该作者
优化体现水平……
当然现在的MCU一般资源比较充足,通常情况下都可以大手大脚一点

使用特权

评论回复
7
lxyppc| | 2010-5-1 20:04 | 只看该作者
楼上,估计你没看懂我的意思,优化中算**删除一些编译器认为无用的语句,这时未必是用户的真实意图所在,可以试试在文件的最后几行 声明一个变量,并赋值,这类语句基本被删除了。不存在合格不合格的问题,有用的且可靠的就是好的,合格的,请理性讨论!
wwwq 发表于 2010-5-1 18:01


不太明白你所遇到的情况,只好就事论事一下
这种情况不应该将问题归咎于编译器
你写出这样的代码本意就是什么也不做,所以被编译器优化掉也是情有可原

使用特权

评论回复
8
voidx| | 2010-5-1 20:33 | 只看该作者
本帖最后由 voidx 于 2010-5-1 20:49 编辑

编译器让人用,就是要开优化。
不开优化只是在调试的时候用。

某些编译器,不开优化,编译出来的代码基本上惨不忍睹,
比如AVRGCC,不开优化基本上不能用。

现在的编译器已经比较聪明。
关闭编译器优化,靠编写代码技巧来优化代码优化,通常优化能力
与编译器开优化差很远。


经不起优化的程序,通常是程序不够规范,会给将来维护留下隐患。
所谓的技巧,严重依赖编译器(换一种编译器,你的技巧可能就不**),可移植性会比较差。

经得起优化,通常代码更加规范,对编译器平台依赖程度低,可移植性更好。

编译优化不是万能的,
但用C语言就不要怕优化,逃避优化。

使用特权

评论回复
9
wwwq|  楼主 | 2010-5-1 21:05 | 只看该作者
各位没搞明白,写程序开个优化是应用级的简单事情,我们希望有高手讨论arm编译器优化的算法和缺陷,不是写程序的时候开不开优化。来错地方了!
另外, 只要编译器是好的,不优化也能用,只是代码长度长点而已,这个板块新手太多,胆子还大。

使用特权

评论回复
10
结缘analog| | 2010-5-1 21:11 | 只看该作者
我觉得还是人的作用大点

使用特权

评论回复
11
z_no1| | 2010-5-2 05:14 | 只看该作者
我也认为既然用C,就不能怕优化,自己写程序要规范。外部IO的地址要用禁止优化字,当然ARM编译器优化的算法和缺陷不是我们这讨论的主题。毕竟我们是吃猪肉的,不是养猪的。

使用特权

评论回复
12
wwwq|  楼主 | 2010-5-2 07:56 | 只看该作者
所谓吃猪肉,就是系统集成的思想,这样下去除了用别人的产品,并随着不断升级外,你没有什么东西是自己的。
再强调一遍:编译时开个优化选项是个傻瓜化的行为,根本不是讨论的目标,如果觉得自己在编程时会开个优化选项就是高手了,离低手很近倒是个事实!

使用特权

评论回复
13
一级菜鸟| | 2010-5-2 09:56 | 只看该作者
各位没搞明白,写程序开个优化是应用级的简单事情,我们希望有高手讨论arm编译器优化的算法和缺陷,不是写程序的时候开不开优化。来错地方了!
另外, 只要编译器是好的,不优化也能用,只是代码长度长点而已,这个 ...
wwwq 发表于 2010-5-1 21:05

些朋友在使用keil或IAR编程时,喜欢设置优化,但实际中,优化的设置会使程序偏离你的设计思路,有时会导致整个软件的运行错误,因此最好的优化是用户在编程时,注意编程技巧,这样才不会使编译器的优化思路干扰了你的工作,一点感想,和同道讨论。


这都是你说的,而“优化的设置会使程序偏离你的设计思路,有时会导致整个软件的运行错误",正是你在源代码级别对优化的控制和流程了解不够造成的,LZ已经有很多人指出合格的代码应当在优化或者不优化的情况下都能得到正确运行,你要讨论什么?讨论什么情况下代码优化后使流程失效,还是要讨论一个for循环延时如何不被优化掉?

新手不新手不是你该评判的,就你的发言来判断菜鸟觉得你才像个新手。

使用特权

评论回复
14
z_no1| | 2010-5-2 14:27 | 只看该作者
吃猪肉,当然要知道是哪块肉,如何吃,营养是什么,要注意什么,
用编译器,写程序时就要知道编译出来是什么汇编代码,有问题时再看下汇编代码是生成了什么东东,ARM我还做不到这个水平,51可以。
对自己知识圈的外围了解就好了,毕竟不在其位不谋其政。关键的还是自己的本行业知识。

使用特权

评论回复
15
voidx| | 2010-5-2 14:38 | 只看该作者
本帖最后由 voidx 于 2010-5-2 14:42 编辑

有些朋友在使用keil或IAR编程时,喜欢设置优化,但实际中,优化的设置会使程序偏离你的设计思路,有时会导致整个软件的运行错误,
------------------------------------------------

“优化的设置会使程序偏离你的设计思路,有时会导致整个软件的运行错误”,

会优化的人,不会让编译器“偏离设计思路”。

“编译器偏离设计思路的优化”不叫会优化。

使用特权

评论回复
16
wwwq|  楼主 | 2010-5-2 16:09 | 只看该作者
to 一级菜鸟
你可以说出优化的算法名称吗?我指的是只会开个优化选项的人,希望和搞过编译器的高手讨论。
不过,在某些情况下,for循环的本意会由于优化而改变作者本意,这是简单常识,不懂的才是菜鸟啊!

to voidx
编译器不是万能的,他的目标是简化代码或缩短运行时间,基本理论先好好看看。

使用特权

评论回复
17
lxyppc| | 2010-5-3 00:23 | 只看该作者
to voidx
编译器不是万能的,他的目标是简化代码或缩短运行时间,基本理论先好好看看。
wwwq 发表于 2010-5-2 16:09

确切地说应该是“编译器优化的目标是在不影响原有逻辑的情况下简化代码或缩短运行时间”

使用特权

评论回复
18
wwwq|  楼主 | 2010-5-3 07:29 | 只看该作者
确切地说应该是“编译器优化的目标是在不影响原有逻辑的情况下简化代码或缩短运行时间”
实际情况是:没有那个编译器达到了完全不影响逻辑,只要简单写几行程序,尤其是用for做延时时,就知道了

使用特权

评论回复
19
清纯咖啡| | 2013-1-21 11:27 | 只看该作者
有时候编译器会影响原有逻辑,尤其是在开中断后,这点很让人头疼。程序代码量比较少的时候基本不会出问题,但是随着代码量的增加,问题就会逐渐出现。现在的编译器优化还不是很完善,不够理想。

使用特权

评论回复
20
john_lee| | 2013-1-21 12:21 | 只看该作者
嗯,编译器确实不够理想,然而并不是因为它优化错误或优化过头了,而是因为它还达不到我认为可以接受的优化程度,我需要它更优化、更优化......
慢慢地等它进化吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

118

帖子

0

粉丝