免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4123 | 回复: 12
打印 上一主题 下一主题

[c] 编译器会把 1024*1024 优化成 1048576 吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-19 20:31 |只看该作者 |倒序浏览

while(1)
{
     len = recv(fd, buf, MAXLEN, 0);

     /* 处理buf中的len字节*/

     cnt++;
     if(cnt % (1024*1024) == 0)
     {
          /* 记录一下计数日志 */
     }
}

编译器会把 1024*1024 优化成 1048576 吗?

"1024*1024"显然比"1048576"或者是"1000000"更直观.

你怎么选择?

论坛徽章:
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
2 [报告]
发表于 2012-05-19 20:34 |只看该作者
yes

use (1UL<<20) if you like.

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2012-05-19 20:43 |只看该作者
会,但这不是“优化”

论坛徽章:
0
4 [报告]
发表于 2012-05-19 20:54 |只看该作者
bruceteen 发表于 2012-05-19 20:43
会,但这不是“优化”


我刚才用
   cc -S t.c
看了一下, 结果是
               addl    $1, -12(%ebp)
               movl    -12(%ebp), %eax
               andl    $1048575, %eax
编译器帮我们计算好了, 确实在没有优化的情况下已经帮我们计算好了

论坛徽章:
0
5 [报告]
发表于 2012-05-20 08:43 |只看该作者
不能指望所有编译器都这么做。但我宁可写成 1 << 20 ,如果发现编译器蠢到不优化这个的话,大不了不用那个编译器。

论坛徽章:
0
6 [报告]
发表于 2012-05-20 08:44 |只看该作者
回复 3# bruceteen

对于编译器的用户来说,这就是优化。
即便不见得有选项控制。

论坛徽章:
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
7 [报告]
发表于 2012-05-20 10:46 |只看该作者
回复 6# 幻の上帝

i understand what he want to said:

he means:
in c:
statement  2*2 is constant
instead of:
expression

but , replacing
a%(1UL<<20) with
a&((1UL<<20)-1)  // andl %rax,((1UL<<20)-1)
is definitely an optimize.
   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
8 [报告]
发表于 2012-05-20 10:50 |只看该作者
这都优化不了,做编译器的人可以去死了。

你能找到哪款编译器优化不了1024*1024的吗?

论坛徽章:
0
9 [报告]
发表于 2012-05-20 21:28 |只看该作者
回复 7# folklore

2*2 is not a statement, but a constant expression, whenever the computation took place.

   

论坛徽章:
0
10 [报告]
发表于 2012-05-21 11:56 |只看该作者
folklore 发表于 2012-05-20 10:46
回复 6# 幻の上帝

i understand what he want to said:



汇编中的取模就是这么计算的吧, 位与就是常见的用法.

另外, 下面的代码怎么优化
   
     if( strncmp(buf, "beijing", strlen("beijing")) == 0 )
     {
          /* 北京的 */
     }
     else if( strncmp(buf, "hebei", strlen("hebei")) == 0)
     {
          /* 河北的 */
     }
     else /* ..... */
     {
     }

     写成strncmp(buf, "beijing", 7), 这个 7 就得口算了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP