社区
数据结构与算法
帖子详情
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
打赏
收藏
c++循环写法与效率问题
(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++){...} 效率相同吗?编译器会自动优化吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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函数
天下第一好大人
2011-12-05
打赏
举报
回复
第一个问题,我用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
打赏
举报
回复
每次得到的值可能不一样
青少儿NOIP信息学奥赛通关必备-
C++
语法-
循环
-while
循环
本课程为零基础
C++
语法专题课,是青少儿参加信息学奥赛NOIP通关必备-语法专题课; 2、本课程每节课均配有练习题以及真题,以锻炼孩子的解题能力; 3、本课程是基于小学生的认知发展水平开发的,运用孩子生活中常见的...
C++
循环
语句的
效率
C++
循环
语句的
效率
C++
/C
循环
语句中,for语句使用频率最高,while语句其次,do语句很少用。本节重点论述
循环
体的
效率
。提高
循环
体
效率
的基本办法是降低
循环
体的复杂性。 【建议4-4-1】在多重
循环
中,如果有...
C++
for
循环
效率
优化
C++
for
循环
效率
优化 背景 今天看到同事的代码,commit message说要提高
循环
效率
,但是看起来非常浪费时间,我就想试一下for
循环
怎么写运行最快,发现还是非常有意思的。 首先是编译选项,在X86系统编译Release,...
C++
各种for
循环
效率
测试
// ...//
C++
Test14 // // #include <iostream> #include <vector> using namespace std; int main(int argc, const char *argv[]) { int a[1000000]; for (int i = 0; i < 10...
提升C/
C++
编程
效率
:深入C/
C++
for
循环
的优化与应用
提升C/
C++
编程
效率
:深入for
循环
的优化与应用
数据结构与算法
33,010
社区成员
35,327
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章