Renesas Synergy™

FAQ 1008140 : 変数を初期化する記述例は?

回答

関数内で auto 変数が初期化されずに使用されている場合、 その変数がレジスタに割り付けられずにメモリのまま残るため、 コード・サイズが大きくなることがあります。


以下の例では、switch のいずれのケースにも該当しない場合に変数 a が初期化されず、 return 文で参照されることになります。
実際には必ずいずれかのケースに該当するとしても、Cコンパイラがレジスタ割り付けにおいて、 プログラムを解析する際には分からないため、初期化されない場合があるとみなされます。
このような場合にCA850のレジスタ割り付けでは割り付けられません。


そこで、初期化を追加することにより、レジスタに割り付けられるようになり、 コード・サイズが削減されます。

 

変更前   変更後 (18byte減 ※)
int func(int x)
{
     int a;

     switch(x) {
     case 0:
         a = VAL0;
         break;
     case 1:
         a = VAL1;
     }
     return a;
}
int func(int x)
{
     int a = 0;

     switch(x) {
     case 0:
         a = VAL0;
         break;
     case 1:
         a = VAL1;
     }
     return a;
}


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



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



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

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

 

 

適用製品

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