C++変数格納方式の概要

3429 ワード

『C++PrimerPlus』では、C++変数には持続性、役割ドメイン、リンク性の3つの特性があると述べています.しかし、私の理解では、持続性と役割ドメインの2つの特性があると思います.持続性とは、変数がメモリに保存される時間です.役割ドメイン(scope)は変数がどの程度の範囲で見られるかを記述している.本でいうリンク性については(この変数は、異なるファイル間で共有できるかどうかが記述されています.リンク性が外部の変数はファイル間で共有できますが、リンク性のない変数はできません).つまり、他のファイルでこの変数を使用できるかどうかは、役割ドメインにも帰属できます.この2つの属性によって、変数は次のように分類されます.
1持続性:自動変数、役割ドメイン:コードブロックは次のように使用されます.
int main()
{
    int temp = 0;
    for(int i = 0;i < 10;i++)
        temp++;
    ...

    return 0;
}

以上のコードではtempは自動変数(もちろんiも)であり、コードブロックの実行が終了するまでメモリから解放され、役割ドメインはその存在するコードブロックである.なお、自動変数はサブコードブロックにも定義されている場合、局所的に定義された変数ほど優先的に使用される特性を有する.
int main()
{
    int temp = 0;
    int i = 10for(int i = 0;i < 10;i++)
        temp++;
    ...

    return 0;
}

上のコードでは、for文の前に定義されたiは、for文定義のiのためにfor文に隠され、このサブコードブロックでサブコードブロック定義の変数が優先的に使用されます.
2レジスタ変数レジスタ変数は特殊で、コンパイラはCPU内部のレジスタを使用して自動変数を格納することを提案し、キーワードregister定義、持続時間、および役割ドメインは1型変数と同じである.(ただし、C++11では既に使用されておらず、キーワードとして以前のプログラムとの互換性のために多く存在する)使用法は以下の通りである.
register int count_fast;

3持続性:静的役割ドメイン:コードブロックの使用方法は次のとおりです.
int fun(int x);
int main()
{
    int temp1 = 10;
    int temp2 = 5;

    fun(temp1);
    ...
    fun(temp2);
    ...

    return 0;
}

int fun(int x)
{
    static int num = 0;
    for(int i = 0;i < x;i++)
        num++;
}

以上のコードでnumは、役割ドメインがfun関数コードブロックのstatic変数であり、numはfun関数でのみ使用できます.キーワードstaticのない変数とは異なり、numはfunを最初に呼び出したときにnumを0に初期化し、funが実行されないときにnumもメモリに保存し、次回呼び出したときにnumは初期化文を実行せず、前回呼び出した後に保持した値を直接使用します.
4持続性:静的役割ドメイン:現在のファイルは次のように使用されます.
//file1
static int temp = 20;
...

//file2
int temp = 7;
...

この変数を使用する場合は、関数の外部で定義する必要があります.任意のコードブロック内で定義できません.キーワードstaticの使用により、tempは現在のファイルでのみ使用され、他のファイルでは使用できません.file 2の定義はfile 1のtempの値に影響しません.
5持続性:静的役割ドメイン:すべてのプロジェクトのファイル定義方法:
//file1
extern int number1 = 20;
int number2 = 30...

この2つの変数は、他のファイルで使用します.
//file2
extern int number1;
extern int number2;
...

同様に、このタイプの変数を関数の外側に定義する必要があります.定義ではキーワードexternは必須ではありません.number 2はfile 2でも同様に使用できます.ただしfile 2でグローバル変数を宣言する場合はキーワードexternを使用する必要があります.また、グローバル変数は定義時に初期化する必要があり、file 2で外部グローバル変数を宣言する際に同時に変数に値を割り当てることはできず、コンパイラは2つの重名の変数を定義したとしてエラーを報告します.