関数の署名を次のように変更する方法をよりよく理解したいと思います。
void foo(double x);
に:
void foo(const double x);
内部の x を変更しないと、コンパイラに代わっていくつかの最適化トリックが発生する可能性があります。誰かが具体的で具体的な例を教えてもらえますか?
関数の署名を次のように変更する方法をよりよく理解したいと思います。
void foo(double x);
に:
void foo(const double x);
内部の x を変更しないと、コンパイラに代わっていくつかの最適化トリックが発生する可能性があります。誰かが具体的で具体的な例を教えてもらえますか?
行った変更は無効です。 x
どちらの場合も値によって渡されるため、それを宣言してconst
も呼び出しサイトには何の影響もありません。唯一の違いは、2 番目のケースでは、実装内でのfoo
変更が許可されないことです。x
ただし、そのような制限を自分自身に課す理由はありません。 を変更しない場合x
、コンパイラは、const
.
関数内のコードがコンパイラで利用可能であると仮定すると、最新のコンパイラは通常、とにかくこれを理解できfoo
ます-そうでない場合、コンパイラがどちらの方法でもできることはほとんどありません。
関数に渡されたポインター/参照/配列変数を変更しないという約束 (または必要に応じて契約) にとっては、はるかに重要です。関数を呼び出すプログラマーにとっては、変更される値に問題がないことを知っているため、さらに重要です。 . ただし、単純な値変数の場合、とにかくコピーであるため、まったく違いはありません。
これは通常、コンパイラーの最適化ではなく、正確さの補助として使用されます。値渡しがある場合、const
このようにマークすることで、別のことを意図したときにパラメーターを誤って変更することを防ぐことができます。
とはいえ、まだ完全に一般的な形式ではありません。
理論的には、コンパイラがメモリからレジスタに 1 回ロードし、値の再読み取りを回避できるようにすることができますが、パラメータのエイリアスを作成するために邪魔にならない限り、コンパイラはどこを参照できるかを調べることができるため、多くの場合、コンパイラは助けを借りずにこれを独自に理解できます。関数のスコープ内で更新されています。