花括号对局部变量的优化
题主这问题带上了垃圾回收的标签…如果没带垃圾回收的标签我会从C或者C++的角度去回答。但带上了的话似乎从Java角度回答更合适。于是放上同样话题的传送门:这段 Java 代码中的局部变量能够被提前回收吗?编译器或 VM 能够实现如下的人工优化吗? - RednaxelaFX 的回答
■网友
在IR的时候就可以看的比较清楚了,做了常量折叠,三个不同作用域的a都存在,并且都做了对应的操作,如果说某个basic-block会被优化掉的话,永假式if(0) {// do somethings} 肯定会被直接忽略掉,然而题主的代码产生的操作不过是push scope,pop scope而已,并不会有实际影响,以上的IR是没有做过特别优化的,如果开了O3, 题主会看见前第一个a在这个例子里直接作为常量,第二个a作为了10 + argc的结果作为printf参数使用,最后一个double a也被直接折叠了,栈里能看见的只有%2 第二个块的a变量。下面是开了O3的IR
【花括号对局部变量的优化】
■网友
当然可以 。
■网友
可以啊,标识符作用域的概念。大括号内的本地变量在最后会被调用析构,出了作用域可以当那个变量不存在,名称可被重复使用。这个并不是编译器优化,而是语言语义上的要求。当然你一定要保证同名变量类型的构造和析构函数自身的逻辑都没有问题,因为编译器可能把他们安排到栈的相同内存位置,如果构造或析构逻辑不完整很可能出现垃圾数据导致不确定的行为的bug。
■网友
可以
■网友
低版本的编译器如Turboc 2.0不行
推荐阅读
- 地区:局部地区将有暴雪 江苏发布低温报告和大风警报
- 多云|最低3℃!局部有霜或霜冻!南通入冬了?
- 装修|装修梦工厂:二手房局部装修,无需搬家,7天换新家!
- 装修|南京装修梦工厂◎局部快装老旧房翻新与墙面刷新装修小知识之卫生间篇
- JS中,a是变量,' \" '+a+' \" ' ,为啥可以让程序读取a的值
- 【气温】 跌跌跌!气温局部降幅达12℃左右!明天气温将进一步下降
- 『浓雾』局部有浓雾或强浓雾 江苏气象台发布大雾黄色预警
- es6的import是加载整个文件还是只加载使用的变量
- JAVA匿名类没有构造器也不能系统默认添加构造器那么为啥要加括号()
- 大运河■在大运河舟楫千里是怎样的体验
