A.7.6 インライン展開

頻繁によびだされる関数をインライン展開することにより、実行速度の向上が図れます。特にループ内で呼ばれる関数などを展開すると大きな効果を得られる場合もあります。しかし、インライン展開をした場合、プログラムサイズが増大する傾向にありますので、プログラムサイズを犠牲にしても実行速度を向上させたい場合に適用してください。

【使用例】

配列aと配列bの要素を交換します。

改善前ソースコード

int x[10], y[10];
static void sub(int *a, int *b, int i)
{
         int temp;
         temp = a[i];
         a[i] = b[i];
         b[i] = temp;
}
 
void func()
{
         int i;
         for(i=0;i<10;i++)
         {
                    sub(x,y,i);
         }
}

改善前アセンブリ展開コード

__$sub:
        SHLL #02H,R3
        ADD R3,R1
        MOV.L [R1],R5
        ADD R3,R2
        MOV.L [R2],[R1]
        MOV.L R5,[R2]
        RTS
_func:
        PUSHM R6-R8
        MOV.L #00000000H,R6
        MOV.L #_x,R7
        MOV.L #_y,R8
L12:
        MOV.L R6,R3
        MOV.L R7,R1
        MOV.L R8,R2
        ADD #01H,R6
        BSR __$sub
        CMP #0AH,R6
        BLT L12
L13:
        RTSD #0CH,R6-R8

改善後ソースコード

int x[10], y[10];
#pragma inline(sub)
static void sub(int *a, int *b, int I)
{
         int temp;
         temp = a[i];
         a[i] = b[i];
         b[i] = temp;
}
 
void func()
{
         int I;
         for(i=0;i<10;i++)
         {
                    sub(x,y,i);
         }
}

改善後アセンブリ展開コード

; インライン展開により
; _subのコードが削減されている
_func:
        MOV.L #0000000AH,R1
        MOV.L #_y,R2
        MOV.L #_x,R3
L11:
        MOV.L [R3],R4
        MOV.L [R2],R5
        MOV.L R4,[R2+]
        MOV.L R5,[R3+]
        SUB #01H,R1
        BNE L11
L12:
        RTS