我用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]
C++标准规定获取引用以NULL调用未定义的行为.所以编译器正在利用这些知识来if完全优化你的检查 - 也就是说,引用它是非法的NULL,所以你的if语句在格式良好的程序中永远不应该是真的.或者换句话说,如果你有一个参考NULL,你的代码是无效的,所以该程序可以随意乱七八糟.
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |