锁定老帖子 主题:不会被编译器优化掉的“空语句”
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-08
一个小问题,土,而且菜,有兴趣您就看看。 通常在debug下断点的时候会需要一些“空语句”,断点就打在“空语句”上。可是像一个分号的这种空语句会被编译器直接优化掉,断点会直接下移,所以请大家想想有什么“空语句”不会被优化掉,且字符数最少。 对“空语句”的要求是不能有生命期超过这一行的变量。 我的想法是delete(new int);
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-09-08
最后修改:2010-09-08
……
另外一个论坛给了个free(0); 这个应该就是极限了 不过如果不用函数,纯粹用操作符和表达式就更好了 |
|
返回顶楼 | |
发表时间:2010-09-08
/od, 不让它做任何优化呗。。。。
|
|
返回顶楼 | |
发表时间:2010-09-08
ray_linn 写道 /od, 不让它做任何优化呗。。。。
那得改工程文件了,每次从VSS上GetLatestVersion,或者添加了新文件要check in,这时候不就有点麻烦了,而且万一忘了就小小地悲剧了。 |
|
返回顶楼 | |
发表时间:2010-09-09
gfdice 写道 ray_linn 写道 /od, 不让它做任何优化呗。。。。
那得改工程文件了,每次从VSS上GetLatestVersion,或者添加了新文件要check in,这时候不就有点麻烦了,而且万一忘了就小小地悲剧了。 自己弄个 makefile编译... |
|
返回顶楼 | |
发表时间:2010-09-10
经典解:
int main(void) { int i; *(volatile int *)&i = 1; // 这行保证不会被优化掉 return 0; } |
|
返回顶楼 | |
发表时间:2010-09-10
callofseen 写道 经典解:
int main(void) { int i; *(volatile int *)&i = 1; // 这行保证不会被优化掉 return 0; } 重新认识了volatile这个“冷僻”的关键字。 但这不够短小,而且变量生命周期太长了。 |
|
返回顶楼 | |
发表时间:2010-09-10
最后修改:2010-09-10
gfdice 写道 callofseen 写道 经典解:
int main(void) { int i; *(volatile int *)&i = 1; // 这行保证不会被优化掉 return 0; } 重新认识了volatile这个“冷僻”的关键字。 但这不够短小,而且变量生命周期太长了。 变通一下嘛 #define sticky_call() do {\ int __i;\ *(volatile int *)&__i = 1;\ } while (0) int main(void) { sticky_call(); return 0; } 另外还有一招 #define sticky_call2() asm volatile("orl %eax, 0") #define MIPS_sticky_call2() asm volatile("sll $0,$0,0") int main(void) { sticky_call2(); return 0; } |
|
返回顶楼 | |
发表时间:2010-09-10
volatile作用非常大的 除了阻止gcc优化掉instruction之外,还能在SMP下阻止cpu乱序执行,这对多线程应用来说是不可缺少的一个feature
|
|
返回顶楼 | |
发表时间:2010-09-10
提这样的问题,纯属吃饱了没事做!
|
|
返回顶楼 | |