12

この単純な関数がインライン化されることを私は知っています:

int foo(int a, int b){
    return a + b;
}

しかし、私の質問は、これが次と同じであることをコンパイラが自動検出できないということです。

int foo(const int a, const int b){
    return a + b;
}

そして、それが検出される可能性があるのに、なぜconstどこにでも入力する必要があるのでしょうか? inlineコンパイラの進歩により、キーワードが時代遅れになったことは知っています。同じことをする時ではありませんconstか?

4

8 に答える 8

19

const変数を変更しなかった結果として置きません。const変更しないことを強制するために使用します。がなければconst、値を変更できます。ではconst、コンパイラは文句を言います。

それはセマンティクスの問題です。値が可変であってはならない場合は、 を使用constします。コンパイラはその意図を強制します。

于 2015-04-21T11:43:04.570 に答える
13

はい、コンパイラはあなたの例で一貫性を証明できます。

いいえ、それは役に立ちません:-)。

更新: Herb Sutter は、彼の落とし穴の 1 つをこのトピックに捧げました ( http://www.gotw.ca/gotw/081.htm )。概要:

  • const は、より効率的にコーディングできる const メンバー関数を含む const オブジェクトの関数をコンパイラとリンカーに選択させることで、最も役立ちます。
  • const は、通常の翻訳単位モデルでは役に立ちません [私が想定していたものとは異なります]。コンパイラは、事実上の constness (単なる宣言では保証されない) を検証し、それを利用するためにプログラム全体を確認する必要があり、またエイリアシングがないことを証明する必要があります ...
  • ...そしてコンパイラーがプログラム全体を見て、事実上の const 性を証明できる場合、実際にはもちろんconst 宣言はもう必要ありません! それは証明できます。当たり前。
  • const が大きな違いを生む 1 つの場所は定義です。これは、コンパイラがオブジェクトを読み取り専用メモリに格納する可能性があるためです。

もちろん、この記事は読む価値があります。

constness cf を利用するために通常必要なプログラム全体の最適化/変換に関して。amdn と Angew からの以下のコメント。

于 2015-04-21T12:39:17.490 に答える
9

これが同じであることをコンパイラが自動検出することはできません...

それが、変数が 2 番目のケースで変更されていないことをコンパイラが検出できるかどうかを意味する場合は、おそらく「はい」です。コンパイラは、両方のコード サンプルに対して同じ出力を生成する可能性があります。ただし、constより複雑な状況ではコンパイラに役立つ場合があります。しかし、最も重要な点は、変数の 1 つを誤って変更することを防ぐことです。

于 2015-04-21T11:41:57.490 に答える
3

多分彼はできるかもしれませんが、constステートメントもあなたのためです。変数を const として設定し、後で新しい値を割り当てようとすると、エラーが発生します。コンパイラが自分で var を作成する場合、これは機能しません。

于 2015-04-21T11:42:47.490 に答える
0

簡単な答え: すべての問題がそれほど単純ではないからです。

より長い答え: 単純な問題で機能するアプローチが複雑な問題でも機能すると仮定することはできません

正確な答え: const はインテントです。const の主な目的は、誤って何かを行うのを防ぐことです。コンパイラが const を自動的に追加する場合、アプローチが const ではないことがわかり、そのままにしておくだけです。const キーワードを使用すると、代わりにエラーが発生します。

于 2015-04-21T11:43:24.510 に答える