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

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

浏览 11269 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-09-08  
C++

一个小问题,土,而且菜,有兴趣您就看看。

通常在debug下断点的时候会需要一些“空语句”,断点就打在“空语句”上。可是像一个分号的这种空语句会被编译器直接优化掉,断点会直接下移,所以请大家想想有什么“空语句”不会被优化掉,且字符数最少。

对“空语句”的要求是不能有生命期超过这一行的变量。

我的想法是delete(new int);

 

   发表时间:2010-09-08   最后修改:2010-09-08
……
另外一个论坛给了个free(0);
这个应该就是极限了
不过如果不用函数,纯粹用操作符和表达式就更好了
0 请登录后投票
   发表时间:2010-09-08  
/od, 不让它做任何优化呗。。。。
0 请登录后投票
   发表时间:2010-09-08  
ray_linn 写道
/od, 不让它做任何优化呗。。。。

那得改工程文件了,每次从VSS上GetLatestVersion,或者添加了新文件要check in,这时候不就有点麻烦了,而且万一忘了就小小地悲剧了。
0 请登录后投票
   发表时间:2010-09-09  
gfdice 写道
ray_linn 写道
/od, 不让它做任何优化呗。。。。

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


自己弄个 makefile编译...
0 请登录后投票
   发表时间:2010-09-10  
经典解:

int
main(void)
{
    int i;

    *(volatile int *)&i = 1; // 这行保证不会被优化掉

    return 0;
}
0 请登录后投票
   发表时间:2010-09-10  
callofseen 写道
经典解:

int
main(void)
{
    int i;

    *(volatile int *)&i = 1; // 这行保证不会被优化掉

    return 0;
}

重新认识了volatile这个“冷僻”的关键字。
但这不够短小,而且变量生命周期太长了。
0 请登录后投票
   发表时间: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;
}
0 请登录后投票
   发表时间:2010-09-10  
volatile作用非常大的 除了阻止gcc优化掉instruction之外,还能在SMP下阻止cpu乱序执行,这对多线程应用来说是不可缺少的一个feature
0 请登录后投票
   发表时间:2010-09-10  
提这样的问题,纯属吃饱了没事做!
0 请登录后投票
论坛首页 编程语言技术版

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