gpt4 book ai didi

c++ - ARMCC 如何优化 C++ 代码

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:37 25 4
gpt4 key购买 nike

我在使用 ARMCC 编译代码时遇到问题。以下是我的代码(代码仅供测试)。

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

使用 –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

然后,我在编译时添加了 –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

所以根据两个输出的比较,我知道编译器删除了 COOptimizerAppUi::DoRealWorksByRef 的主体。是的,我知道有 –O0、–O1、–O2、–O3 来控制优化行为。但是查了那么多资料,也没有搞清楚编译器是怎么优化代码的。那么您对编译器优化有什么规则吗?欢迎任何评论/详细信息。

提前致谢。

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

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

最佳答案

C++ 标准规定获取对NULL 的引用会调用未定义的行为。因此,编译器正在利用这些知识来优化您的 if 检查完全——也就是说,引用 NULL 是非法的,所以您的 if 语句在格式良好的程序中永远不应该为真。或者换句话说,如果您有对 NULL 的引用,则您的代码是无效的,因此程序可以自由运行。

关于c++ - ARMCC 如何优化 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9125129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com