花括号对局部变量的优化

题主这问题带上了垃圾回收的标签…如果没带垃圾回收的标签我会从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不行


    推荐阅读