可能性のある重複:
なぜ誰かが#defineを使用して定数を定義するのですか?
c ++のマクロとconstの違い
C++-enum vs. const vs. #define
定数の作成に#define
とconst
を使用することの違いは何ですか?他に比べてパフォーマンス上の利点はありますか?当然、const
を使用することを好みますが、適切な利点がある場合は#define
を検討します。
#define
ディレクティブはプリプロセッサディレクティブです。プリプロセッサはこれらのマクロを本体で置き換えます(== --- ==)beforeコンパイラはそれを認識します。ソースコードの自動検索および置換と考えてください。
Const変数宣言は、言語で実際の変数を宣言します。実際の変数と同じように、実際の変数と同じように、アドレスを取得したり、渡したり、使用したり、キャスト/変換したりできます。
ああ、パフォーマンス:変数の宣言を避けることで時間とスペースを節約できると思うかもしれませんが、賢明なコンパイラ最適化レベルでは、コンパイル時に定数値が既に置き換えられて折り返されているため、違いはありません。しかし、型チェックとデバッガーにコードを知らせるという大きな利点が得られるため、const変数を使用しない理由は実際にはありません。
#define
は、マクロプリプロセッサによる置換のためのエンティティを作成します。これは、定義とは定数として扱われるかどうかによって、定数とはまったく異なります。 #defineの内容は任意に複雑になる可能性があり、古典的な例は次のようになります。
#define SQR(x) (x)*(x)
後で使用する場合:
SQR(2+3*4)
それは次のようになります。
(2+3*4)*(2+3*4)
違いは、#defineがプリプロセッサによって処理され、単純なテキスト置換に相当することです。このように定義された定数値は実際のコンパイラーには表示されませんが、const修飾子で定義された変数は実際に型付けされた「変数」です(実際にはその変数ではありません)。 #defineの短所は、名前のすべての出現を置き換えることです。一方、const変数は通常のルックアップを取得するため、名前の競合のリスクが低く、タイプセーフではありません。
#defineの利点は、constnessを保証するため、バッキング変数がないことです。定数変数はコードに置換される場合とされない場合があるため、#defineは状況によっては高速になる場合があります。しかし、優れたコンパイラーはとにかくそれらのconstをインライン化する必要があり、ほとんどの状況で大きな違いを生む可能性は低いので、コンパイラーが変数と非常にパフォーマンスが重要なコードです。
#define
はテキストによる置換であるため、可能な限り高速です。さらに、それは安定性を保証します。欠点は、タイプセーフではないことです。
一方、const
変数は、コード内でインラインで置換される場合とされない場合があります。 constをメモリに強制的に流し去ることができます(おそらく、それはおそらく読み取り専用メモリに常駐しますが、いずれにしても頭痛の種があります)。ただし、独自のタイプを保持するため、タイプセーフであることが保証されています。
あなたの意図を明確にするために、個人的にconst
をお勧めします。
#define A B
は、プリプロセッサ(コンパイラの一部)に、コード内でB
が見られる場合は常にA
を使用するよう指示し、コードをコンパイルする前にそれを行います。 (ひどい考えですが)#define FALSE TRUE
。
Const変数とは、変数がいったん設定されると変更できないことを意味しますが、プリプロセッサでは何も行わず、変数の通常の規則に従います。
DEFINEはプリプロセッサ命令です。たとえば、#define x5。コンパイラはこの値を取得し、プログラムでxを呼び出してオブジェクトファイルを生成する場所にinsertを挿入します。定数を定義すると、シンボルテーブルにシンボルエントリが作成されません。プログラムをデバッグする場合、xは見つかりません。可能な限り定数を使用してください。