关于变量在for循环内外定义的思考
2017-04-13 14:58
411 查看
关于变量在for循环内外定义的思考
在c#或java里面,我们通常会这样写for循环:for(int i = 0;i<10;i++) { Console.WriteLine(i); }
前一阵子,我突发奇想,如果按照下面这样写,会不会比上面的运行效率高一些:
首先是在内层循环中定义变量到底会不会存在重复分配的问题,这涉及到编译器的优化,不过主流编译器(如vs和gcc)这一块优化都比较好,不会反复分配变量。函数的定义是编译器的事情,运行的时候不存在什么定义,更没有什么开销。
除非是类对象或者结构体对象, 在for循环里面与外面, 开销可能会不一样.基本数据类型, 那是一样的, 编译器肯定会优化这个东西。
一般来说, 在进入函数时, 所有的栈变量都分配好空间了. 所以那个for变量写在哪里都是一样的. 具体你可以看一下反汇编代码, 全部就展现在你眼前了,我查看过C#的IL代码,发现两种写法的IL代码是一样的,说明没有区别。
栈中的空间在编译这个代码的时候大小就确定下来了,运行这个方法时空间就已经分配好了,不要想当然的以为声明一次就要分配一次空间,那是c语言,java可以重用这些超出作用域的空间。只要用javap查看方法字节码,看看使用的局部变量表的大小和使用方式即知java这种基于虚拟机的语言,是跟单纯的C不同,C语言的原则是相信程序员能做好一切,因此它不会帮你做多少事情,需要考虑代码优化,内存占用等。
而java中的原则就是:要写好的代码而不是快的代码。
不过,自己在编程的时候要注意不要让上一次的结果影响到下一次循环,比如上一次 a = 3, 当下一次循环在给a赋值的时候出了错误,而你捕获了错误,却没修正a的值,程序继续执行,那么这时候a=3还成立,可能就会有问题了,如果是每次都重新定义,那就不存在这样的问题。
最后总结:
对于使用int等基本数据类型作为循环变量,只要你用的优化方面足够给力的主流的编译器,完全不需要关心在循环外还是循环内定义循环变量。
如果循环变量本身是复杂的对象,建议在循环外定义好,并且在
for循环的赋值语句、判断语句中,都要避免重复创建对象。
转载地址:http://www.cnblogs.com/DHclly/p/5540918.html
相关文章推荐
- 【C++】关于变量在for循环内外定义的思考
- 关于Java语言for循环内外变量定义的问题
- 关于C语言定义变量的思考
- 关于在循环中和在循环外定义变量的区别的思考
- 转载:关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题
- 关于autotool中使用的预定义变量问题
- 关于变量的类型与变量初始化的一点思考
- 关于头文件中定义的全局变量的包含
- 关于在Page_Load定义外部变量输出
- 关于头文件定义全局变量等问题
- 关于语言定义的思考
- 关于Action里面定义的变量问题
- c中switch case 中关于变量定义问题
- 关于头文件中定义的全局变量的包含
- 尽量别在for循环里面定义变量
- 关于头文件变量重复定义问题怎么解决(thinkvd开发日志)
- switch case关于定义变量的规定
- 关于c语言定义变量
- js for循环,为什么一定要加var定义i变量
- 关于final 变量的思考