|
本帖最后由 擦鞋匠 于 2017-10-24 14:41 编辑
实验环境:
Keil MDK 5.14 + stm32f103
实验简介:
额,本人有一点代码整洁癖(只有一点点,说的更清楚点,我所谓的代码“整洁”,更多的是指代码“整齐“)。所以,对于比较简单的if...else...(类似大括号内只有一条简单赋值语句这种),我更倾向于使用问号表达式,因为更“整齐”。
如下代码1是C代码,代码2是if...else...部分的汇编,代码3是问号表达式部分的汇编。
代码1:
- int a, b, c, d, e, f=1, g=2;
- int add1(int x, int y)
- {
- return x + y;
- }
- int add2(int x, int y)
- {
- return x + y + 1;
- }
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- delay_init();
- uart_init(115200);
-
- printf("aaa");
- if (a > 0)
- {
- b = 2;
- }
- else
- {
- b = 1;
- }
- d = (a > 0) ? 2 : 1;
-
- e = ((a > 0) ? add1 : add2)(f, g); //这样写的风险在哪里?为什么?
-
- printf("e = %d\r\n", e);
-
- while (1);
- }
复制代码
代码2
- 0x08000220 480A LDR r0,[pc,#40] ; @0x0800024C //该语句的作用是什么
- 0x08000222 6800 LDR r0,[r0,#0x00]
- 0x08000224 2800 CMP r0,#0x00
- 0x08000226 DD03 BLE 0x08000230
- 0x08000228 2002 MOVS r0,#0x02
- 0x0800022A 4909 LDR r1,[pc,#36] ; @0x08000250
- 0x0800022C 6008 STR r0,[r1,#0x00]
- 0x0800022E E002 B 0x08000236
- 0x08000230 2001 MOVS r0,#0x01
- 0x08000232 4907 LDR r1,[pc,#28] ; @0x08000250
- 0x08000234 6008 STR r0,[r1,#0x00]
复制代码
代码3
- 0x08000236 4805 LDR r0,[pc,#20] ; @0x0800024C
- 0x08000238 6800 LDR r0,[r0,#0x00]
- 0x0800023A 2800 CMP r0,#0x00
- 0x0800023C DD01 BLE 0x08000242
- 0x0800023E 2002 MOVS r0,#0x02
- 0x08000240 E000 B 0x08000244
- 0x08000242 2001 MOVS r0,#0x01
- 0x08000244 4903 LDR r1,[pc,#12] ; @0x08000254
- 0x08000246 6008 STR r0,[r1,#0x00]
复制代码
实验问题:
1> 我容易纠结if...else...和问号表达式到底谁的效率更高(尽管我也明白,纠结这点效率根本就不重要),刨根问底来看,此处似乎使用if...else...效率更高,但是占用的flash也更多(编译产生的指令更多)。很多rtos源码如freertos等,基本不使用问号表达式,为什么?
2> 代码1注释语句,请问这样写逻辑不严密吗(之前看网上看资料,有人极其反对这种写法,但我不明白原因)? 为什么?
3> 代码2注释语句,该语句的作用是什么(我看汇编指令介绍,LDR一般都是相对于寄存器偏移,如LDR r0,[r1,#20],我不明白此处相对PC偏移有什么意义)?
恳请大神指教,不胜感激。。。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|