Renesas Synergy™

FAQ 1008123 : (unsigned) short, char 型の変数の記述例は?

回答

(unsigned) ANSI-C の仕様により、短整数 ( (unsigned) short, (unsigned) char)型の変数は、 演算時に int 型または unsigned int 型に拡張されるため、これらの変数を使用したプログラムに対しては (特にこれらの変数がレジスタに割り付けられた場合には)、 型変換命令が多く生成されます。
(unsigned) int 型にすればこの型変換が不要となるため、コード・サイズが削減されます。
特に、比較的レジスタに割り付けられやすいスタック変数は、できるだけ (unsigned)int 型を用いましょう。

 

変更前   変更後 (2byte減 ※)
    unsigned char i;

        ...

    for(i = 0; i < 4; i++) {
        array[2 + i] = *(p + i);
    }
    int i;

        ...

    for(i = 0; i < 4; i++) {
        array[2 + i] = *(p + i);
    }


※削減量は例に関するものであり、個々のケースにより異なります。



ソースを変更した結果、出力命令が減少し、高速化もされる場合があります。



ソース変更を行う際には、次のような点に注意してください。

  • ソース変更によりレジスタの使用状況が変わるため、意図しない箇所において、それまで最適化されずに残っていたレジスタ転送が削除されたり、 逆に、最適化が効かなくなって冗長なレジスタ転送が残ったりする可能性があります。
  • テンポラリ変数を追加することにより、新たなレジスタ変数用レジスタが使用されるようになり、それに伴い、関数の入口/出口でそのレジスタの退避/復帰が追加されることがあります。この場合、退避/復帰のコード分(8バイト)だけコード・サイズが増加します。

 

 

適用製品

V850用コンパイラパッケージ [CA850]
他にご質問がございましたら、リクエストを送信してください