设为首页 加入收藏

TOP

C++在循环内和循环外定义变量的差异(如何写出高效的for循环)
2015-07-16 12:56:53 来源: 作者: 【 】 浏览:5
Tags:循环 定义 变量 差异 如何 写出 高效 for

写这篇文章的原因是我在问答平台看到的一个问题:C++内层循环中定义变量和在外面定义比影响大吗?


此处我给出的回答是:


看到答案和评论,好像有很多人对这个感兴趣,所以我打算给大家实测分享一下,于是写了如下代码进行测试:


OK,程序非常简单,Test1Test2是两个循环,干相同的事情,就是在双重循环里打印一下 ij 的值,差别只在于一个在循环外定义变量 j,另一个在循环内定义变量 j


此处我使用g++进行编译,优化等级是O0(这是GCC默认的优化等级,也是最低的优化等级)的:


编译后,我将生成的Test1函数和Test2函数反汇编出来,得出的结果是这样的:


Test1函数反汇编如下:


Test2函数反汇编如下:


Test1的反汇编中,我们在内部for (int j = 0; j < 3; j++)下面,没有看到分配变量 j 的汇编指令,如果再只打印Test1Test2的汇编代码,经过对比,你们发现这两个函数产生的汇编指令是完全一样的:


当然,这里只测试了g++的编译效果。vs下的效果大家可以自己测试。目前可以肯定,如果你使用gcc的编译器,你完全可以不用纠结在循环外定义变量还是循环内定义变量,因为效果完全是一样的,不过为了代码好看,还是写到循环内吧。


上面已经探究了使用基本数据类型int作为循环变量的情况,这里需要进阶一下,探讨一下如果我使用的不是int,而是一个复杂的对象,那循环的效果又是如何呢?


为了方便看到变量的分配,我在类的构造函数里加了打印语句,可以让我们方便地看到类的对象被创建的情况:


好的,还是使用g++ -O0编译,我们来看看执行结果:


可以看到,Test3创建对象的次数是最少的,如果对象比较复杂,显然Test3会是最高效的编码方式。


对于整个程序的输出,我们可以分析一下:


最后总结:


------------------------------分割线------------------------------


C语言梳理一下,分布在以下10个章节中:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python标准库:内置函数sum(itera.. 下一篇Linux下TCP网络编程与基于Windows..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: