找回密码
 欢迎注册
查看: 18801|回复: 13

[求助] 关于for循环的strlen

[复制链接]
发表于 2012-1-27 21:58:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
我在链接http://www.cprogramming.com/tips ... in-a-loop-condition
里看到一个小技巧,说不要在for循环的条件判断语句里使用strlen函数,说假如a_str有1000个字符,那么strlen函数将会被调用1001次,循环体被执行1000次,
  1. for ( int ix = 0; ix < strlen(a_str); ix++)
  2. {
  3.      a_str[ix] = tolower( (unsigned char) a_str[ix] );
  4. }
复制代码
我有点不解,gcc编译器默认的情况下 不会做优化,预存 strlen函数的结果 吗
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2012-1-27 22:11:32 | 显示全部楼层
回顾了以前写的程序,
感觉编译器不会对for 做这种优化的。
我想多了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-1-28 21:33:59 | 显示全部楼层
别依赖编译器,多用个变量多放心
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-1-28 22:29:57 | 显示全部楼层
这样写不能预存吧,循环内可以改变字符串的内容,预存就不正确了.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-1-29 10:13:52 | 显示全部楼层
a_str是常量的话会预存。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-1-29 11:29:15 | 显示全部楼层
这样写不能预存吧,循环内可以改变字符串的内容,预存就不正确了.
gracias 发表于 2012-1-28 22:29

他刚好修改了源字符串,如果把a_str[0]设置为'\0'直接就该退出
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2012-1-29 22:48:40 | 显示全部楼层
5# 风云剑
真的假的啊,
可有凭证
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2012-1-29 22:50:08 | 显示全部楼层
别依赖编译器,多用个变量多放心
〇〇 发表于 2012-1-28 21:33

嗯,以后我会把判断中的常量放在for里面的初始化语句里
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-1-30 08:53:12 | 显示全部楼层
5# 风云剑
真的假的啊,
可有凭证
wayne 发表于 2012-1-29 22:48

如果a_str是常量,设置与只需要后面的循环中,的确现在很多编译器可以识别出strlen(a_str)也是常量。这个是因为有些编译器会将strlen作为内置函数,也就是编译器知道这个函数没有副作用
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2012-2-1 22:16:34 | 显示全部楼层
9# mathe
多谢mathe,我搜了一下,stackoverflow 上有人问过同样的问题:
http://stackoverflow.com/questio ... ed-in-this-for-loop
有人说:
That's implementation-dependent. Usually, it gets called every time, but, if the compiler can see that word never changes, and that strlen is a pure function (no side effects), it can lift the call.

意思同你讲的 如出一辙。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-3-29 09:01 , Processed in 0.065794 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表