避免编译器优化掉代码

c++代码编译成Release版本,编译器会做一些优化,生成的二进制可执行文件执行更快,体积更小。这种优化会复用栈上不同变量的空间,导致调试的时候,有些局部变量看不到了。比如如下代码:

在调试的的时候,调试器直接运行到printf(“%d”, ic);这一行,而ia,ib,ic这些局部变量统统被优化了看不到,如下图所示:

20160811150851

如果程序在某个地方崩溃了,而崩溃地方的局部变量恰好被编译器优化掉了,调试的时候看堆栈的变量值几乎没有什么价值。chromium的base库里里面有个解决办法,就是把局部变量传给Alias,Alias函数的实现如下:

Alias函数其实不对传进来的局部变量做什么,只是函数的实现禁用了编译器优化,这样调试的时候就可以看到局部变量来,效果如下:

20160811150605

《避免编译器优化掉代码》有2个想法

  1. hi~ 能不能做到不优化某个函数呢? 我遇到一个崩溃问题, 报错堆栈只能定位到某个函数, 不能具体到某一行, 所以我不想让编译器优化这个可能报错的函数, 以便在下次报错中能够拿到具体的行号. 请问chrome有类似的机制吗?

    1. 可以的,一样的道理。
      在函数前加上,
      #pragma optimize(“”, off)
      在函数后加上
      #pragma optimize(“”, on)

发表评论

电子邮件地址不会被公开。 必填项已用*标注