鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

循环变量使用和体系结构匹配的整数类型

【说明】 以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}