C++変数の格納説明子とcv-限定子

2321 ワード

C++で変数を作成する場合、前にいくつかの修飾子がある場合がありますが、ここでまとめます.
大きく2つのカテゴリに分けられます.説明子とcv制限子を格納します.
きおくディスクリプタ
ストレージ・ディスクリプタには、次のものがあります.
  • auto
  • register
  • static
  • extern
  • mutable

  • Auto修飾子の変数は自動変数で、変数に修飾子がない場合はデフォルトで自動変数であり、その役割ドメインは関数内部にあります.
    register修飾変数は、CPUアクセスレジスタの値が通常スタックに格納されている値にアクセスするよりも速いことをコンセプトとしてレジスタ変数を作成します.宣言方法:
    register int count_fast;
    

    コンパイラは、必ずしも変数をレジスタに格納する要件(占有されている可能性があるなど)を満たすとは限らず、レジスタにメモリアドレスがないため、レジスタ変数はアドレスオペレータでは使用できません.
    staticは静的変数を修飾する.静的変数の使用範囲に注意してください.
    int global = 1000;//       ,        
    //             global    ,   extern  (         ,     ),   static          global(       )
    static int one_file = 50;//       static  ,            
    void func (int n) {
      static int count = 0;//      static  ,        ,          ,     ,               ,          
      int lama = 0;//     ,        ,          
    }
    

    関数内で外部の静的変数と同じ名前の変数を作成する場合は、独自に作成したものを使用しますが、次の操作子で外部を使用することを示します.
    int global = 1000;
    void func () {
      int global = 500;
      cout << global << endl;// 500
      cout << ::global << endl;// 1000
    }
    

    extern修飾の変数は参照宣言を表し、ファイル1が外部変数を宣言したと仮定し、ファイル2が使用するには、前述したように2つの同名の外部変数を作成できないため、externを使用して修飾する必要があります.
    // file1.cpp
    int global = 1000;
    
    // file2.cpp
    extern int global;
    

    mutable修飾の変数は、その名の通り、変数が可変であることを示していますが、いつ可変ではありませんか.後述するconst修飾子を使用して修飾する場合、変数は可変であるべきですが、このような使い方がある可能性があります.
    struct person {
      char name[30];
      mutable int age;
    };
    const person me = {"Cloudox", 24};
    strcpy(me.name, "Cloud");//       ,     person   me  const   
    me.age++;//        ,     person   age mutable   
    

    cv-限定子
    cv制限子は2種類しかありません.
  • const
  • volatile

  • これもなぜcv限定子と呼ばれ、頭文字を取ったのか.
    constキーワードは前述したように、変数を表すメモリが初期化された後、プログラムは変更できません.
    volatileが修飾した変数の場合、プログラムコード自体が変数のメモリユニットを変更していなくても変化する可能性があることをプログラムに伝えます.
    どうして変わったの?シリアルポートからの時間や情報を含むハードウェアの場所を指すと仮定すると、プログラムではなくハードウェア自体が変更される可能性があります.
    なぜプログラムが変化する可能性があることを教えたのでしょうか?コンパイラは、プログラムがいくつかの文で変数を使用していることを発見したと仮定するため、最適化のためにプログラムを複数回調べるのではなく、レジスタにキャッシュします.この最適化は、変数自体がプログラムによって変更されないことを前提としているが、ハードウェアが変数値を変更すると、この最適化は使用できない.そのためvolatileキーワードは実際にはコンパイラにこの変数をこのように最適化しないように伝えます.
    作者のトップページを見る