关于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函数的结果 吗 回顾了以前写的程序,
感觉编译器不会对for 做这种优化的。
我想多了 别依赖编译器,多用个变量多放心 这样写不能预存吧,循环内可以改变字符串的内容,预存就不正确了. a_str是常量的话会预存。 这样写不能预存吧,循环内可以改变字符串的内容,预存就不正确了.
gracias 发表于 2012-1-28 22:29 http://bbs.emath.ac.cn/images/common/back.gif
他刚好修改了源字符串,如果把a_str设置为'\0'直接就该退出 5# 风云剑
真的假的啊,
可有凭证 别依赖编译器,多用个变量多放心
〇〇 发表于 2012-1-28 21:33 http://bbs.emath.ac.cn/images/common/back.gif
嗯,以后我会把判断中的常量放在for里面的初始化语句里 5# 风云剑
真的假的啊,
可有凭证
wayne 发表于 2012-1-29 22:48 http://bbs.emath.ac.cn/images/common/back.gif
如果a_str是常量,设置与只需要后面的循环中,的确现在很多编译器可以识别出strlen(a_str)也是常量。这个是因为有些编译器会将strlen作为内置函数,也就是编译器知道这个函数没有副作用 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