Chinaunix

标题: a&&b&&c&&b&&a, 编译器能明白我的意思并优化么? [打印本页]

作者: xinglp    时间: 2010-06-27 02:46
标题: a&&b&&c&&b&&a, 编译器能明白我的意思并优化么?
本帖最后由 xinglp 于 2011-03-25 15:33 编辑

a b c 都是表达式
作者: Etrnls    时间: 2010-06-27 04:33
你的意思是什么?

int x, y, z;
x && y && z && y && x

int foo();
int bar();
int whatever();
foo() && bar() && whatever() && bar() && foo()
是不一样的……
作者: bluesea666    时间: 2010-06-27 07:51
应该能吧!
作者: bluesea666    时间: 2010-06-27 07:51
你的意思是什么?

int x, y, z;
x && y && z && y && x

int foo();
int bar();
int whatever(); ...
Etrnls 发表于 2010-06-27 04:33



    具体说说?  学习一下.
作者: langue    时间: 2010-06-27 11:39
找抽
作者: prolj    时间: 2010-06-27 13:00
恐怕人都不能理解。
作者: Kabie    时间: 2010-06-27 13:54
什么地方可以优化。。。{:3_191:}
作者: xinglp    时间: 2010-06-27 14:39
本帖最后由 xinglp 于 2010-06-27 14:40 编辑

是这个样子的

  1. while(
  2. s1>=SrcHead&&
  3. s2>=TargetHead&&
  4. (!(*s1-*s2))
  5. ){--s1;--s2;}
复制代码
如果编译器先算后面的(!(*s1-*s2)), 可能已经s1<SrcHead了, 就会访问SrcHead的前面的数据, 越界. 虽然是只读

所以就想弄成

  1. s1>=SrcHead&&
  2. s2>=TargetHead&&
  3. (!(*s1-*s2))&&
  4. s1>=SrcHead&&
  5. s2>=TargetHead
复制代码
来保证一下顺序(编译器不会从中间算吧),但是>=都做了两次判断, (程序中,两次变成四次)
普通的gcc编译,不加-O参数,能把两次判断优化成一次么?
作者: pmerofc    时间: 2010-06-27 17:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: xinglp    时间: 2010-06-27 18:13
回复 9# pmerofc

这个是编译器无关的么?  我太土了
作者: prolj    时间: 2010-06-27 18:31
()
作者: Etrnls    时间: 2010-06-27 19:18
具体说说?  学习一下.
bluesea666 发表于 2010-06-27 07:51



    原来楼主说的是顺序的问题……

其实我的意思是
int a, b, c;
// blablah...
if (a && b && c && b && a)
这样编译器算到a && b && c都是true的时候会知道后面那个b和a一定和前面的一样,既然前面已经是true了,那计算到这里肯定最后结果就是true了


如果是某些有副作用的东西的话那一定要把这个表达式算完才行
作者: ling0088    时间: 2010-06-27 20:14
依稀记得以前C语言的时候老师教过
(i=0)&&(i=1)&&(i=2)
类似的问题吧
作者: pmerofc    时间: 2010-06-27 20:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: OwnWaterloo    时间: 2010-06-27 21:12
&&的求值顺序是被定死了的, 而且还会短路, 从一开始就是这样。
这样, 下面的语句就有了保证, 肯定不会解引用一个非空指针:

  1. if ( p && p->is_xxx )
复制代码

作者: xinglp    时间: 2010-06-27 23:54
谢谢
作者: starwing83    时间: 2010-06-28 05:01
好雷的代码………………




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2