未使用的变量会被编译器优化掉么?会分配内存么?

QuantumEnergy 2017-11-19 03:26:26
int a; //如果后面没有使用该变量,是否被编译器优化掉?
int a[1024*1024]; //如果后面不使用该变量,是否被优化?
测试结果(附图):
int a; // 会被编译器优化掉
int a[1024*1024];// 不会被优化掉
为什么int a[1024*1024];// 不会被优化?



...全文
1436 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
codedoctor 2017-11-22
  • 打赏
  • 举报
回复
不同编译器,就VS来说的话,debug模式下一般是不会优化掉未使用的局部变量的,release模式下就比较凶残了,就连使用的空函数体都会被优化掉,for循环都帮你展开
赵4老师 2017-11-21
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!) VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
  • 打赏
  • 举报
回复
subq $4194336,%rsp这才是分配局部变量空间,不是你指的那行。
自信男孩 2017-11-20
  • 打赏
  • 举报
回复
编译优化也会分级别,gcc -O1(或2),每个优化级别分别做不同的优化;建议查询一下优化级别; 若不用的变量,编译器一般会提示,若能优化则最好,若不会优化会占用内存空间。建议不适用的变量直接删掉; 另外,不建议在函数内定义较大的数组,比如1024 * 1024;因为栈上的空间是有限的,在栈上使用较大的空间会影响程序的运行效率
xskxzr 2017-11-19
  • 打赏
  • 举报
回复
优不优化没有明确规定,不同编译器有不同处理。 即使是同一编译器,比如gcc, 不加优化选项时:https://godbolt.org/g/JSquKz 加-O1时:https://godbolt.org/g/ZexJfN
paschen 2017-11-19
  • 打赏
  • 举报
回复
Debug下不会被优化,Release通常是会被优化掉的

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧