对比#if 1和#if 0 两种代码编写方式,经过反编译汇编对比得出:
for循环逻辑指令少(30行),但是存在循环跳转,因此展开循环体指令数量远超累加方式,执行效率低(这里忽略每条指令执行耗时差异);
累加方式逻辑指令多(33行),但无跳转因此效率高。
因为for循环只有3次,且循环体逻辑简单,因此展开书写更好,如果循环体逻辑复杂,则循环体的逻辑指令大于循环指令,则for循环方式更好!
static u32 bits21Tou32(u8 *indata)
{
#if 1
u32 temp=0;
temp = (temp<<8) + indata[0];
temp = (temp<<8) + indata[1];
temp = (temp<<8) + indata[2];
return temp;
#else
u32 temp = 0;
u32 i;
for(i = 0;i<3;i++)
{
temp = (temp<<8) + indata[i];
}
return temp;
#endif
}
0102db38 <bits21Tou32>://走for循环3次的反汇编
102db38: b480 push {r7}
102db3a: b085 sub sp, #20
102db3c: af00 add r7, sp, #0
102db3e: 6078 str r0, [r7, #4]
102db40: 2300 movs r3, #0
102db42: 60fb str r3, [r7, #12]
102db44: 2300 movs r3, #0
102db46: 60bb str r3, [r7, #8]
102db48: e00a b.n 102db60 <bits21Tou32+0x28>
102db4a: 68fb ldr r3, [r7, #12]
102db4c: 021b lsls r3, r3, #8
102db4e: 6879 ldr r1, [r7, #4]
102db50: 68ba ldr r2, [r7, #8]
102db52: 440a add r2, r1
102db54: 7812 ldrb r2, [r2, #0]
102db56: 4413 add r3, r2
102db58: 60fb str r3, [r7, #12]
102db5a: 68bb ldr r3, [r7, #8]
102db5c: 3301 adds r3, #1
102db5e: 60bb str r3, [r7, #8]
102db60: 68bb ldr r3, [r7, #8]
102db62: 2b02 cmp r3, #2
102db64: d9f1 bls.n 102db4a <bits21Tou32+0x12>//调到102db4a循环
102db66: 68fb ldr r3, [r7, #12]
102db68: 4618 mov r0, r3
102db6a: 3714 adds r7, #20
102db6c: 46bd mov sp, r7
102db6e: bc80 pop {r7}
102db70: 4770 bx lr
...
0102db38 <bits21Tou32>://走连续累加3次的反汇编
102db38: b480 push {r7}
102db3a: b085 sub sp, #20
102db3c: af00 add r7, sp, #0
102db3e: 6078 str r0, [r7, #4]
102db40: 2300 movs r3, #0
102db42: 60fb str r3, [r7, #12]
102db44: 68fb ldr r3, [r7, #12]
102db46: 021b lsls r3, r3, #8
102db48: 687a ldr r2, [r7, #4]
102db4a: 7812 ldrb r2, [r2, #0]
102db4c: 4413 add r3, r2
102db4e: 60fb str r3, [r7, #12]
102db50: 68fb ldr r3, [r7, #12]
102db52: 021b lsls r3, r3, #8
102db54: 687a ldr r2, [r7, #4]
102db56: 3201 adds r2, #1
102db58: 7812 ldrb r2, [r2, #0]
102db5a: 4413 add r3, r2
102db5c: 60fb str r3, [r7, #12]
102db5e: 68fb ldr r3, [r7, #12]
102db60: 021b lsls r3, r3, #8
102db62: 687a ldr r2, [r7, #4]
102db64: 3202 adds r2, #2
102db66: 7812 ldrb r2, [r2, #0]
102db68: 4413 add r3, r2
102db6a: 60fb str r3, [r7, #12]
102db6c: 68fb ldr r3, [r7, #12]
102db6e: 4618 mov r0, r3
102db70: 3714 adds r7, #20
102db72: 46bd mov sp, r7
102db74: bc80 pop {r7}
102db76: 4770 bx lr