写这篇文章的原因是我在问答平台看到的一个问题:C++内层循环中定义变量和在外面定义比影响大吗?
此处我给出的回答是:
看到答案和评论,好像有很多人对这个感兴趣,所以我打算给大家实测分享一下,于是写了如下代码进行测试:
OK,程序非常简单,Test1和Test2是两个循环,干相同的事情,就是在双重循环里打印一下 i 和 j 的值,差别只在于一个在循环外定义变量 j,另一个在循环内定义变量 j。
此处我使用g++进行编译,优化等级是O0(这是GCC默认的优化等级,也是最低的优化等级)的:
编译后,我将生成的Test1函数和Test2函数反汇编出来,得出的结果是这样的:
Test1函数反汇编如下:
Test2函数反汇编如下:
在Test1的反汇编中,我们在内部for (int j = 0; j < 3; j++)下面,没有看到分配变量 j 的汇编指令,如果再只打印Test1和Test2的汇编代码,经过对比,你们发现这两个函数产生的汇编指令是完全一样的:
当然,这里只测试了g++的编译效果。vs下的效果大家可以自己测试。目前可以肯定,如果你使用gcc的编译器,你完全可以不用纠结在循环外定义变量还是循环内定义变量,因为效果完全是一样的,不过为了代码好看,还是写到循环内吧。
上面已经探究了使用基本数据类型int作为循环变量的情况,这里需要进阶一下,探讨一下如果我使用的不是int,而是一个复杂的对象,那循环的效果又是如何呢?
为了方便看到变量的分配,我在类的构造函数里加了打印语句,可以让我们方便地看到类的对象被创建的情况:
好的,还是使用g++ -O0编译,我们来看看执行结果:
可以看到,Test3创建对象的次数是最少的,如果对象比较复杂,显然Test3会是最高效的编码方式。
对于整个程序的输出,我们可以分析一下:
最后总结:
------------------------------分割线------------------------------
将C语言梳理一下,分布在以下10个章节中: