c语言 编译器优化没被调用的函数,编译器优化及优化问题的调试方法

优化影响了那些内容

局部变量

这里提到的局部变量包含一个 block 中定义的局部变量以及参数传递中使用的局部变量。 这些局部变量可能会经历从栈里面分配到使用寄存器到直接移除的过程。这些局部变量都只是临时保存中间的计算结果,可以直接优化掉,则调试时不能看到局部变量的值。

函数中的语句的位置

写代码的时候通常会认为执行的逻辑是按照预定的排布依次执行的,可优化可能会对语句的位置进行调整,甚至将一些语句与其它的语句进行合并,这样在调试时可能会有跳前跳后的现象。

函数调用关系

优化可能会消除一些函数调用关系,编译器可能会将小函数直接展开,多个函数之间可能会合并栈帧,这样你在调试时可能会看到一个奇怪的函数名称。

优化影响调试的根本原因

调试信息是在优化之前生成的。由于优化过程中可能对程序进行了调整,这将导致调试信息与执行代码不一致,调试信息部分失效。

GCC 中一些会导致调试信息无效的情况

常规表达式的删除,如将多个实例合并为一个实例

固定不变代码的移动。如将循环中并不会改变的表达式移动到循环开始处

指令重排

移动指令以使加载和存储与其它代码部分重叠。将计算得到的值的过程向值的使用位置靠近。赋值语句可能并不会立刻执行,当需要用到值的时候可能会跳回去执行。

大的跳跃

不同的代码块被合并造成的结果。一些以 goto、return、break 这些跳转语句结束的序列容易产生这种现象

不固定的变量——变量的值不可预测

赋值语句被移动,寄存器复用,值传递过程中变量被忽略等都可能造成这个问题

更详细的说明详见 Debugging Optimezed Code。

优化问题的一些解决方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值