【プログラミングベース】constと#defineの違い

5082 ワード

【前言】
他の人のコードを見たときに出会ったことがあると思います.#defineで定義する人もいれば、constで定義する人もいます.
では、両者の違いはいったい何なのでしょうか.どちらが使いやすいですか.
ネットで調べたり調べたりして、まとめてみます.
【まとめ】
  • コンパイラの処理方式が異なる
  • #defineマクロは前処理段階で展開
    const定数はコンパイル実行フェーズで使用
  • タイプとセキュリティチェックが異なる
  • #defineマクロにはタイプがなく、タイプチェックもせず、展開のみ
    const定数には特定のタイプがあり、コンパイルフェーズでタイプチェックが実行されます.
  • 記憶方式が異なる
  • #defineマクロは展開するだけで、どこで使うか、何度展開してもメモリは割り当てられません
    const定数はメモリに割り当てられます(スタック内でもスタック内でも構いません)
  • constは、不要なメモリ割り当てを回避するためにスペースを節約します.例:
  • #define PI 3.14159//定数マクロconst doulbe Pi=3.14159;このときPiをROMに入れていない…        double i=Pi;//この時点でPiにメモリを割り当て、以降は割り当てません!        double I=PI;//コンパイル中にマクロ置換を行い、メモリdouble j=Piを割り当てる//メモリ割り当てdouble J=PI;//マクロの置き換えを行い、メモリを再割り当てします.const定義定数はアセンブリの観点から、#defineのように即時数ではなく、対応するメモリアドレスが与えられるだけであるため、const定義定数はプログラム実行中にコピーが1部しかなく、#define定義定数はメモリにいくつかのコピーがある. 
  • constにより効率が向上
  • コンパイラは通常、通常のconst定数にストレージスペースを割り当てるのではなく、シンボルテーブルに保存します.これにより、コンパイル中の定数となり、ストレージとリードメモリの操作がなくなり、効率が向上します.
  • constのdefineよりの利点
  • const定数にはデータ型があり、マクロ定数にはデータ型がありません.コンパイラは、前者のタイプのセキュリティチェックを行うことができます.一方、後者は文字置換のみを行い、タイプセキュリティチェックがないため、文字置換で予想外のエラー(境界効果)
  • が発生する可能性がある.
  • 統合デバッグツールによってはconst定数をデバッグできますが、マクロ定数をデバッグできません.
  • C++においてプログラムはマクロ定数を使用するのではなくconst定数のみを使用する、すなわちconst定数はマクロ定数
  • に完全に取って代わる.
  • ある定数が他の定数と密接に関連する場合、この関係は定義に含まれるべきであり、いくつかの孤立した値
  • を与えるべきではない.
    1 // 
    
    2 const float RADIUS = 100;
    
    3 const float DIAMETER = RADIUS * 2;
  • クラス宣言でconstデータメンバー
  • を初期化することはできません.
    1 class A{
    
    2     const int SIZE = 100; //   const 
    
    3     int array[SIZE]; //   SIZE
    
    4 }
  • constデータメンバーの初期化はクラス構築関数の初期化テーブルでのみ
  • を行う.
    1 class A{
    
    2     A(int size); // 
    
    3     const int SIZE;
    
    4 }
    
    5 A::A(int size) : SIZE(size){ //  
    
    6 7 }
    
    8 A  a(100);  //   a  SIZE 100
    
    9 A  b(200);  //   b  SIZE 200
  • は、クラス全体にわたって一定の定数
  • を列挙定数で実現する.
    1 class A{
    
    2 3         enum { SIZE1 = 100, SIZE2 = 200}; //  
    
    4         int array1[SIZE1];
    
    5         int array2[SIZE2];
    
    6 };
    
    7 // , 。
    
    8 // : , , ( PI=3.14159)。

     
    これだけにしましょう,深く研究しません