hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 640|回复: 9

关于for循环的strlen

[复制链接]

562

主题

741

帖子

1933

积分

大司空

Rank: 5Rank: 5

积分
1933
发表于 2024-2-20 14:36:13 | 显示全部楼层 |阅读模式
我在链接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++){     a_str[ix] = tolower( (unsigned char) a_str[ix] );}
复制代码
我有点不解,gcc编译器默认的情况下 不会做优化,预存 strlen函数的结果 吗
回复

使用道具 举报

0

主题

180

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2024-2-20 14:36:50 | 显示全部楼层
回顾了以前写的程序,
感觉编译器不会对for 做这种优化的。
我想多了
回复

使用道具 举报

0

主题

157

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-20 14:37:10 | 显示全部楼层
别依赖编译器,多用个变量多放心
回复

使用道具 举报

0

主题

189

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-2-20 14:37:37 | 显示全部楼层
这样写不能预存吧,循环内可以改变字符串的内容,预存就不正确了.
回复

使用道具 举报

0

主题

194

帖子

38

积分

新手上路

Rank: 1

积分
38
发表于 2024-2-20 14:38:07 | 显示全部楼层
a_str是常量的话会预存。
回复

使用道具 举报

0

主题

178

帖子

25

积分

新手上路

Rank: 1

积分
25
发表于 2024-2-20 14:38:58 | 显示全部楼层
这样写不能预存吧,循环内可以改变字符串的内容,预存就不正确了.
gracias 发表于 2012-1-28 22:29
他刚好修改了源字符串,如果把a_str[0]设置为'\0'直接就该退出

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

174

帖子

31

积分

新手上路

Rank: 1

积分
31
发表于 2024-2-20 14:39:03 | 显示全部楼层
5# 风云剑
真的假的啊,
可有凭证
回复

使用道具 举报

0

主题

193

帖子

166

积分

关内侯

Rank: 2

积分
166
发表于 2024-2-20 14:39:28 | 显示全部楼层
别依赖编译器,多用个变量多放心
〇〇 发表于 2012-1-28 21:33
嗯,以后我会把判断中的常量放在for里面的初始化语句里

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

174

帖子

63

积分

关内侯

Rank: 2

积分
63
发表于 2024-2-20 14:39:52 | 显示全部楼层
5# 风云剑
真的假的啊,
可有凭证
wayne 发表于 2012-1-29 22:48
如果a_str是常量,设置与只需要后面的循环中,的确现在很多编译器可以识别出strlen(a_str)也是常量。这个是因为有些编译器会将strlen作为内置函数,也就是编译器知道这个函数没有副作用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

169

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 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.
意思同你讲的 如出一辙。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-5-3 00:26 , Processed in 0.071090 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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