我有一个很大的工程,运行时出现了问题。
发现是某个指针调用函数的地方,被编译器优化掉了根本就没有执行,形如
if(!p->a()){
  p1->b();//这句话竟然被优化掉了,debug的时候反编译,发现竟然没有生成语句如果我改成
if(!p->a()){
  if(p1)p1->b();//这里的p1->b()就能执行,有对应的代码。因为这是在一个比较大的工程里面,我自己试图写一个小例子程序来重现,发现不行:struct o
{
char* ps;
bool g(){return false;}
void destroy(){if(ps)delete[] ps;}
o():ps(NULL){}
};
int _tmain(int argc, _TCHAR* argv[])
{
o* po;
if(argc==1)
{
po=new o;
}
if(!po->g())
{
po->destroy();//发现这里不需要判断po是否是NULL,总是会生成有效代码
}
return 0;
}我的问题是,究竟什么时候编译器会把一个函数调用给"优化掉"? 很迷惑啊

解决方案 »

  1.   

    在Debug时还会优化吗?我只听说过Release的时候有编译器优化。疑惑……
      

  2.   

    p1->b();
    你在这个函数里显示各对话框看看是否被优化掉了?
    理论上不会优化掉的,Release下跟踪程序时源代码是对应不上的
    或者如果编译器发现你的p1一直为空,在Release下为了保证程序的健壮性,直接疲敝掉这句的调用
    目前应该编译器没有这么智能,你还是看看你哪块出了问题
      

  3.   

    一般debug是没有开优化的,除非楼主改了工程的设置
    不知道楼主对反汇编的了解有多深,不行就拿ollydbg试一下