1

IAR C / C ++コンパイラのマニュアルでは、最適化に適したソースコードを作成するために次のように述べています。

&演算子を使用してローカル変数のアドレスを取得することは避けてください。これは2つの主な理由で非効率的です。まず、変数はメモリに配置する必要があるため、プロセッサレジスタに配置することはできません。これにより、コードが大きくなり、遅くなります。第2に、オプティマイザーは、ローカル変数が関数呼び出しの影響を受けないと想定できなくなりました。

ローカル変数のアドレスを取得する他の方法はありますか?明らかに、その変数へのポインターがあればそれを使用でき、配列があれば配列名を使用できることはわかっていますが、ローカル変数のアドレスを取得する他の方法を認識していません。 &演算子。

4

1 に答える 1

6

アドレス[*]を取得する他の方法はありません。&そのアドバイスの「演算子を使用する」というテキストは冗長です。使用を避けるべきものが明確でない場合に備えて、どの演算子がaddress-of演算子であるかを思い出させるためだけにあると思います。

それが話している最適化は次のとおりです。

1)アドレスを取得しない場合、変数にアドレスを指定する必要はありません。

2)アドレスがコンパイラーが認識できるコードを「エスケープ」しない場合、コンパイラーは、値が認識できないコードを介して変更されないと想定できます。アドレスを取得しないことでこれが保証されますが、場合によっては、アドレスが取得された場合でもコンパイラがエスケープ分析を実行できます。

これらの目的のどちらでも、アドレスがどのように取得されるかは実際には重要ではないため、Cでアドレスを取得する別の方法&ある場合は、オペレーターと一緒にアドバイスに言及する必要があります。

[*] [編集:ああ!私は少し間違っています。変数が配列の場合、演算子を使用せずにそのアドレスを取得できます&。最初の要素へのポインターに減衰させます。IARコンパイラが実際に十分に小さい配列をレジスタに最適化するかどうかはわかりません。そうでない場合は、言及する必要はありません。しかし、それは確かに許されています。]

于 2012-10-18T16:59:26.693 に答える