c++循环写法与效率问题

iwantnon 2011-08-08 01:33:46
(1)for(int i=0;i<=n-1;i++){...}与for(int i=0;i<n;i++){...}效率相同吗?编译器会自动优化吗?
(2)对于vector类型变量vec,那么
for(int i=0;i<(int)vec.size();i++){...}

int n=vec.size();
for(int i=0;i<n;i++){...}
效率相同吗?编译器会自动优化吗?
...全文
392 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
soarfish 2011-12-07
  • 打赏
  • 举报
回复
(1) i<n 的效率稍微高一些,不需要对n再减1

(2)循环内对vec不做操作,i<n 效率也高的。不用每次去关联函数的。
we_sky2008 2011-12-05
  • 打赏
  • 举报
回复
(1)for(int i=0;i<=n-1;i++){...}与for(int i=0;i<n;i++){...}效率相同吗?编译器会自动优化吗?

这个后者的效率不会低于前者,而前者如果不优化的话,效率会略低于后者,因为前者是边界是n - 1;每次都要取n值再减1



(2)对于vector类型变量vec,那么
for(int i=0;i<(int)vec.size();i++){...}

int n=vec.size();
for(int i=0;i<n;i++){...}
效率相同吗?编译器会自动优化吗?

这个编译器应该会优化的,因为size成员函数只是简单的传回size;所以size肯定是inline函数
  • 打赏
  • 举报
回复
第一个问题,我用gcc4.6.0编译试了一下,发现汇编代码是一致的(无论开不开优化,两种循环的汇编代码都一样)。都是检测变量i是否和n不等(用的汇编指令jne)。但是并没有编译成楼上所说的和0比较。

shines77 2011-12-03
  • 打赏
  • 举报
回复
第一个问题, 编译器一般会编译成
for(int i=n-1;i>=0;--i){...}, 因为寄存器跟0比较是最快的, 除非循环内的i值的顺序不可更改, 例如: x[i] += x[i-1]; // x[i]的计算跟i的循环方向有关

第二个问题, 跟大家看法一样
chaoplusplus 2011-11-28
  • 打赏
  • 举报
回复
林锐好像是我学长
[Quote=引用 4 楼 iwantnon 的回复:]

引用 2 楼 dizuo 的回复:
建议lz看看
林瑞的高质量C/C++编程

下载了,我看看:)
[/Quote]
turing-complete 2011-11-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zheng_ai 的回复:]

第二个不会优化。因为在循环中可能增删数组元素,致使size改变。
对STL容器的遍历,建议使用迭代器。只有在需要随机访问的时候,才使用下标。
[/Quote]

增删的时候,size 不跟着变化吗? 优化会有化成什么样子? 是不是this.m_size ?
zheng_ai 2011-11-27
  • 打赏
  • 举报
回复
第二个不会优化。因为在循环中可能增删数组元素,致使size改变。
对STL容器的遍历,建议使用迭代器。只有在需要随机访问的时候,才使用下标。
imlint 2011-11-25
  • 打赏
  • 举报
回复
以上只是个人臆测...
imlint 2011-11-25
  • 打赏
  • 举报
回复
for(int i=0;i<n;i++){...} 应该好点
因为不用每次都算n-1
一叶之舟 2011-08-09
  • 打赏
  • 举报
回复
循环在效率在于循环次数和每次处理的耗时,第一个问题两种循环次数是一样的,处理过程也是一样的,所以效率应该是一样的。
for(int i=0;i<(int)vec.size();i++){...}

int n=vec.size();
for(int i=0;i<n;i++){...}
如果处理过程不改变vec的大小的情况下,第二种方式效率要高,很明显有一次函数调用。如果中间要改变vec中的内容,这种方式本身就是错误的,因为你的循环变成了未知的次数。
cfvmario 2011-08-08
  • 打赏
  • 举报
回复
我觉得(1)二者效率必然一样。。因为比较对象非0时,总要一个cmp然后jx指令,jx指令是<和<=都有
mkcing 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 iwantnon 的回复:]

引用 1 楼 ga6840 的回复:
对于第二个里面那个一直调用size(),每次得到的值都不一样,不知道那个逻辑上是想干什么。

怎么不一样,一样吧。
[/Quote]
这个肯定要依据具体情况而定啊,假如你循环了对vector进行了插入删除操作,.size()得到的值肯定不一样嘛。
iwantnon 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
建议lz看看
林瑞的高质量C/C++编程
[/Quote]
下载了,我看看:)
iwantnon 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ga6840 的回复:]
对于第二个里面那个一直调用size(),每次得到的值都不一样,不知道那个逻辑上是想干什么。
[/Quote]
怎么不一样,一样吧。
ryfdizuo 2011-08-08
  • 打赏
  • 举报
回复
建议lz看看
林瑞的高质量C/C++编程
ga6840 2011-08-08
  • 打赏
  • 举报
回复
比较条件是从标志寄存器获取结果的,虽然和cpu的实现有关,但是我认为这样的优化没有考虑的价值,如果计算次数确实很多,可以考虑内联汇编。但是优化最好的角度往往是从方法角度上考虑的,而不是命令形式。
对于第二个里面那个一直调用size(),每次得到的值都不一样,不知道那个逻辑上是想干什么。
636f6c696e 2011-08-08
  • 打赏
  • 举报
回复
第一个问题毫无意义,第二个问题所执行的结果不同,因情况而定.
ga6840 2011-08-08
  • 打赏
  • 举报
回复
每次得到的值可能不一样。
ga6840 2011-08-08
  • 打赏
  • 举报
回复
每次得到的值可能不一样

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧