循环变量使用和体系结构匹配的整数类型
【说明】 以32位处理器为例,对于U8或者U16,部分编译器会进行与操作或者前置归零来将值扩展成32位,增加了不必要的指令开销。
【注意事项】 循环变量的类型与循环上限之间需要满足,循环上限需要在循环变量的类型最大值范围内。
【案例】
优化前:采用unsigned char类型循环变量:
int Func()
{
unsigned int maxLoop = GetAssignment();
for (unsigned char i = 0; i < maxLoop; ++i) {
DoSomething();
}
return 0;
}
汇编指令如下,其中针对unsigned char类型的变量,需要额外增加“and r4, r4, #255”指令进行数据截断:
Func():
push {r4, r5, r6, lr}
bl GetAssignment()
subs r5, r0, #0
beq .L2
mov r4, #0
.L3:
add r4, r4, #1
and r4, r4, #255
bl DoSomething()
cmp r4, r5
bcc .L3
.L2:
mov r0, #0
pop {r4, r5, r6, pc}
优化后:采用unsigned int类型循环变量:
int Func()
{
unsigned int maxLoop = GetAssignment();
for (unsigned int i = 0; i < maxLoop; ++i) {
DoSomething();
}
return 0;
}
汇编指令如下,无需进行数据截断:
Func():
push {r4, r5, r6, lr}
bl GetAssignment()
subs r5, r0, #0
beq .L2
mov r4, #0
.L3:
add r4, r4, #1
bl DoSomething()
cmp r5, r4
bne .L3
.L2:
mov r0, #0
pop {r4, r5, r6, pc}
父主题: 控制语句