wayne 发表于 2012-1-27 21:58:57

关于for循环的strlen

我在链接http://www.cprogramming.com/tips/tip/dont-use-strlen-in-a-loop-condition
里看到一个小技巧,说不要在for循环的条件判断语句里使用strlen函数,说假如a_str有1000个字符,那么strlen函数将会被调用1001次,循环体被执行1000次,for ( int ix = 0; ix < strlen(a_str); ix++)
{
   a_str = tolower( (unsigned char) a_str );
}我有点不解,gcc编译器默认的情况下 不会做优化,预存 strlen函数的结果 吗

wayne 发表于 2012-1-27 22:11:32

回顾了以前写的程序,
感觉编译器不会对for 做这种优化的。
我想多了

〇〇 发表于 2012-1-28 21:33:59

别依赖编译器,多用个变量多放心

gracias 发表于 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 http://bbs.emath.ac.cn/images/common/back.gif
他刚好修改了源字符串,如果把a_str设置为'\0'直接就该退出

wayne 发表于 2012-1-29 22:48:40

5# 风云剑
真的假的啊,
可有凭证

wayne 发表于 2012-1-29 22:50:08

别依赖编译器,多用个变量多放心
〇〇 发表于 2012-1-28 21:33 http://bbs.emath.ac.cn/images/common/back.gif
嗯,以后我会把判断中的常量放在for里面的初始化语句里

mathe 发表于 2012-1-30 08:53:12

5# 风云剑
真的假的啊,
可有凭证
wayne 发表于 2012-1-29 22:48 http://bbs.emath.ac.cn/images/common/back.gif
如果a_str是常量,设置与只需要后面的循环中,的确现在很多编译器可以识别出strlen(a_str)也是常量。这个是因为有些编译器会将strlen作为内置函数,也就是编译器知道这个函数没有副作用

wayne 发表于 2012-2-1 22:16:34

9# mathe
多谢mathe,我搜了一下,stackoverflow 上有人问过同样的问题:
http://stackoverflow.com/questions/2049480/how-many-times-will-strlen-be-called-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.
意思同你讲的 如出一辙。
页: [1] 2
查看完整版本: 关于for循环的strlen