书写高效的C代码

驱动程序是系统很重要的部件,代码效率直接影响着系统的效率,因而书写高效的代码至关重要.

1.代码中量不要使用位操作的结构体,而直接使用位操作,我写了如下的测试代码:

typedef union Test_Reg
{
UINT32 value;
struct
{
unsigned a : 5;
unsigned reserved1 : 3;
unsigned b : 4;
unsigned reserved2 : 4;
unsigned c : 8;
unsigned reserved3 : 8;
};
} TestReg;

static TestReg test_st;
static DWORD g_dwTest;

void test_function( int a, int b, int c )
{
test_st.dayOfMonth=a;
test_st.month=b;
test_st.year=c;
}

void test_ok( int a , int b , int c )
{
g_dwTest= (a)|(b<<8)|(c<<16);

}

其生成的汇编代码如下:
test_function
{

stmdb sp!, {r4, r5, lr}
mov r5, r2


: test_st.dayOfMonth=a;
: test_st.month=b;

ldr r4, [pc, #0x2C]
mov lr, #0
sub lr, lr, #0xF2, 28
ldr r3, [r4]
and r1, r1, #0xF
and r2, r0, #0x1F
and r3, r3, lr
orr r3, r3, r1, lsl #8
orr r3, r3, r2
str r3, [r4]

: test_st.year=c;

strb r5, [r4, #2]

}

ldmia sp!, {r4, r5, lr}
bx lr


ENDP


test_ok

{


str lr, [sp, #-4]!
: g_dwTest= (a)|(b<<8)|(c<<16);

ldr lr, [pc, #0x10]
orr r3, r1, r2, lsl #8
orr r3, r0, r3, lsl #8
str r3, [lr]
}

ldr lr, [sp], #4
bx lr

ENDP


可见前者的效率明显低,效率只有后者的1/3.
后者使用了3行代码,而前者用了12行

原文地址:https://www.cnblogs.com/ceblog/p/1772376.html