- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 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/
我正在尝试使用使用 ARMCC 编译器的 Keil ARM 工具删除未使用的代码。我以前使用过基于 GCC 的 ARM 编译器,我可以使用以下方法轻松删除未使用的代码: -fdata-sections
为什么下面编译: ITE EQ MRSEQ R0, MSP MRSNE R0, PSP 但这不是: ITT NE MRSNE R0, PSP MRSEQ R0, MSP MRSNE R0,PSP和MR
我正在使用 armcc 和 armlink 来编译和链接我的程序。编译源代码后,我试图用 armlink 命令链接它们,但我得到了这个错误: fatal error :./Release/Source
我在使用 ARMCC 编译代码时遇到问题。以下是我的代码(代码仅供测试)。 void COptimizerAppUi::DoRealWorksByRef(COptimizerAppUi& aObjec
我正在将一些软件从 gcc 工具链移植到 armcc 工具链(处理器保持不变 (Cortex-A9))。在 C 代码中使用了 memcpy。 armcc 通过调用 __aeabi_memcpy 替换了
int main(){ __asm volatile { // load data vld1.16 {q0, q1}, [r0]! ... 使用命令 armcc --cpu=Corte
我尝试使用外部 MCU (EFM32) 使 BLE121LR 模块工作。据我了解,这段代码声明了将结构转换为二进制数据,对吗?有人可以向我解释如何为其添加 ARM (EFM32) 支持吗?非常感谢!!
我正在 Keil (V5) 中建立一个基本项目。我想在我的项目中使用 C++。我正在使用 ARMCC 编译器。 我创建了一个简单的类 CTest。但似乎我的项目设置/编译器不支持 C++。 C 代码编
构建完成后,我在映射文件中找到了(i.function名称)部分。 ================================================== ==== 例如) [foo1.
最接近我的问题的线程是这些 Escaping a # symbol in a #define macro?和 How to print a pound / hash via C preprocesso
在这里引用@auselen 的回答:Using ARM NEON intrinsics to add alpha and permute ,看起来 armcc 编译器在 NEON 优化方面比 gcc
我有一个C项目,其中一些函数也是用arm neon汇编编写的,但是我无法编译它,main()所在的文件中有几个错误,而且它看起来很晦涩,我正在使用DS-5 用于编译,它可以在 MSVC 上构建并运行良
我有一个基于 STM32L4 MCU(超低功耗 Cortex-M4)的板,用于 GNSS 跟踪目的。我不使用 RTOS,所以我使用自定义调度程序。编译器和环境是KEIL uVision 5(编译器5.
我的编译器发出警告 #381-D: extra ";"在这种情况下被忽略: 我定义了一个结构,如下所示 struct example_s { u8_t foo; SOME_MACRO(bar)
我正在使用 Keil uVision4 在 STM32F2 设备上进行开发。我正在尝试使用 C++,这应该可以通过 uVision 工具链提供的 armcc(如果我错了请纠正我)实现。但是 uVisi
我有一个适用于 STM32F407 处理器的 uVision 5.13 项目,我也在使用 RTX 操作系统,我正在尝试使用一些 C++11 功能,例如作用域枚举,但是当我放置 --cpp11 编译器选
我正在尝试使用 ARM Compiler 5 armcc 编译的 .c 文件中的内联汇编中的 STM/LDM 指令生成 AXI 总线突发访问。 inline void STMIA2(uint32_t
我是一名优秀的程序员,十分优秀!