ARMCC如何优化C++代码

1 c++ optimization arm

我用ARMCC编译代码时有一个问题.以下是我的代码(仅用于测试的代码).

void COptimizerAppUi::DoRealWorksByRef(COptimizerAppUi& aObject)
{
if( NULL == &aObject )
    {
    RDebug::Printf("This is for testing reference,add:%P", &aObject); 
    aObject.HandleStatusPaneSizeChange();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用-asm -interleave为我的发布版本编译它,我有以下输出.只生成了一个ASM语句.函数体中的所有代码都缺失了.

COptimizerAppUi::DoRealWorksByRef(COptimizerAppUi&)
;;;216    
;;;217    void COptimizerAppUi::DoRealWorksByRef(COptimizerAppUi& aObject)
000254  4770              BX       lr
;;;218        {
;;;219        if( NULL == &aObject )
;;;220            {
;;;221            RDebug::Printf("This is for testing reference,add:%P", &aObject); 
;;;222            aObject.HandleStatusPaneSizeChange();
;;;223            }
;;;224        }
;;;225
Run Code Online (Sandbox Code Playgroud)

然后,我编译它添加-O0,然后我得到以下输出.这里预期的所有代码都有自己的ASM指令.

                  _ZN15COptimizerAppUi16DoRealWorksByRefERS_ PROC ; 
COptimizerAppUi::DoRealWorksByRef(COptimizerAppUi&)
;;;216    
;;;217    void COptimizerAppUi::DoRealWorksByRef(COptimizerAppUi& aObject)
000328  b570              PUSH     {r4-r6,lr}
;;;218        {
00032a  0005              MOVS     r5,r0
00032c  000c              MOVS     r4,r1
;;;219        if( NULL == &aObject )
00032e  2c00              CMP      r4,#0
000330  d108              BNE      |L1.836|
;;;220            {
;;;221            RDebug::Printf("This is for testing reference,add:%P", &aObject); 
000332  0021              MOVS     r1,r4
000334  a01a              ADR      r0,|L1.928|
000336  f7fffffe          BL       _ZN6RDebug6PrintfEPKcz ; RDebug::Printf(const char*, ...)
;;;222            aObject.HandleStatusPaneSizeChange();
00033a  6820              LDR      r0,[r4,#0]
00033c  3080              ADDS     r0,r0,#0x80
00033e  6a81              LDR      r1,[r0,#0x28]
000340  0020              MOVS     r0,r4
000342  4788              BLX      r1
                  |L1.836|
;;;223            }
;;;224        }
000344  bd70              POP      {r4-r6,pc}
;;;225    
                          ENDP
Run Code Online (Sandbox Code Playgroud)

所以根据两个输出的比较,我知道编译器删除了COptimizerAppUi :: DoRealWorksByRef的主体.是的,我知道有-O0,-O1,-O2,-O3来控制优化的行为.但是我搜索了很多材料并且没有得到编译器如何优化代码.那你有关于编译器优化的规则吗?欢迎任何评论/详细信息.

提前致谢.

顺便说一句,在我的环境中:C:\ armcc

ARM C/C++编译器,RVCT4.0 [Build 902]

Sti*_*sis 5

C++标准规定获取引用以NULL调用未定义的行为.所以编译器正在利用这些知识来if完全优化你的检查 - 也就是说,引用它是非法的NULL,所以你的if语句在格式良好的程序中永远不应该是真的.或者换句话说,如果你有一个参考NULL,你的代码是无效的,所以该程序可以随意乱七八糟.