论坛首页 编程语言技术论坛

不会被编译器优化掉的“空语句”

浏览 11268 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-09-10  
gfdice 写道
ray_linn 写道
/od, 不让它做任何优化呗。。。。

那得改工程文件了,每次从VSS上GetLatestVersion,或者添加了新文件要check in,这时候不就有点麻烦了,而且万一忘了就小小地悲剧了。


个人觉得取消优化比人为的加入空语句有意义得多,只需要写一个makefile写一个
!if "$(DEBUG)" == "1"
CFLAGS=/od
!else
CFLAGS=/Ox
!endif

这不就结了么

0 请登录后投票
   发表时间:2010-09-10   最后修改:2010-09-10
debug需要空语句的理由是什么?

例如:
A语句
空语句
B语句
如果断点在空语句,这和断点在B语句有什么差别?

A语句
空语句
}
这种情况断点加在最后的}上也OK

看不到需要空语句的理由
0 请登录后投票
   发表时间:2010-09-10  
{ bool bored = true;}
0 请登录后投票
   发表时间:2010-09-10  
突然想起来x86有nop指令的嘛

#define sticky_call()  asm volatile ("nop")
0 请登录后投票
   发表时间:2010-09-10  
piao_bo_yi 写道
{ bool bored = true;}


这个会被-O2给抹掉
0 请登录后投票
   发表时间:2010-09-15  
强强爱妍妍 写道
debug需要空语句的理由是什么?

例如:
A语句
空语句
B语句
如果断点在空语句,这和断点在B语句有什么差别?

A语句
空语句
}
这种情况断点加在最后的}上也OK

看不到需要空语句的理由


例如,有一个LRESULT的返回值需要判断,而可能的返回值是在别的头文件里用MAKELRESULT之类的宏算出来的,也就是用TRACE打出来数值还得打出来这些MAKELRESULT的宏的值来对比,而且懒得TRACE,就想下个断点看看,那我就可以这样:
switch(result)
{
case MACRO1:
break;
case MACRO2:
break;
case MACRO3:
break;
blabla...
}
请问我断点打在哪里?
0 请登录后投票
   发表时间:2010-09-15  
gfdice 写道
强强爱妍妍 写道
debug需要空语句的理由是什么?

例如:
A语句
空语句
B语句
如果断点在空语句,这和断点在B语句有什么差别?

A语句
空语句
}
这种情况断点加在最后的}上也OK

看不到需要空语句的理由


例如,有一个LRESULT的返回值需要判断,而可能的返回值是在别的头文件里用MAKELRESULT之类的宏算出来的,也就是用TRACE打出来数值还得打出来这些MAKELRESULT的宏的值来对比,而且懒得TRACE,就想下个断点看看,那我就可以这样:
switch(result)
{
case MACRO1:
break;
case MACRO2:
break;
case MACRO3:
break;
blabla...
}
请问我断点打在哪里?

描述真隐晦...
0 请登录后投票
   发表时间:2010-09-16  
你都已经是debug了, 为什么不用编译参数, 你可以编译不同的debug版本啊。
0 请登录后投票
   发表时间:2010-09-22   最后修改:2010-09-22
这种情形是有的。有时候的确需要这样的语句来帮助调试。
写一个无用的类,在其中暴露一个public static的成员,然后给这个成员赋值,编译器应该是不会去优化掉它的。因为编译器无法判断它是否有用。这个办法比较通用,而且代码量也少。
比如A.b=1;
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics