litong 发表于 2024-2-20 14:36:13

关于for循环的strlen

我在链接http://www.cprogramming.com/tips ... 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函数的结果 吗

Zpasarbola 发表于 2024-2-20 14:36:50

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

AbertVab 发表于 2024-2-20 14:37:10

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

asomiajht 发表于 2024-2-20 14:37:37

这样写不能预存吧,循环内可以改变字符串的内容,预存就不正确了.

singqing 发表于 2024-2-20 14:38:07

a_str是常量的话会预存。

ipeuric 发表于 2024-2-20 14:38:58

这样写不能预存吧,循环内可以改变字符串的内容,预存就不正确了.
gracias 发表于 2012-1-28 22:29 http://bbs.emath.ac.cn/images/common/back.gif
他刚好修改了源字符串,如果把a_str设置为'\0'直接就该退出

oliajazpafi 发表于 2024-2-20 14:39:03

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

esuruekinz 发表于 2024-2-20 14:39:28

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

owobapiakuw 发表于 2024-2-20 14:39:52

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

aecupeemow 发表于 2024-2-20 14:40:17

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.
意思同你讲的 如出一辙。
页: [1]
查看完整版本: 关于for循环的strlen