C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の記憶クラス(ストレージクラス)とは?auto・static・externなどの5種類を解説

C++プログラミングにおいて、記憶クラス(ストレージクラス)とは、変数や関数のスコープ(可視性)と寿命(ライフタイム)を定義するための指定子です。記憶クラス指定子は、修飾対象となる型の前に記述します。C++プログラムで使用できる記憶クラスには、以下の5種類があります。

  • auto
  • register
  • static
  • extern
  • mutable

auto:自動記憶域期間

auto記憶クラス指定子は、自動記憶域を持つ変数を明示的に宣言するためのものです。ブロック内で宣言された変数のデフォルトはautoであり、自動記憶域を持つ変数xは、xが宣言されたブロックを抜けると破棄されます。

auto指定子は、ブロック内で宣言された変数名や関数の仮引数名にのみ適用できます。ただし、これらの名前はもともと自動記憶域を持っているため、データ宣言においてauto指定子は通常冗長です。

autoは当初、Cとの構文互換性を保つためだけにC++へ引き継がれましたが、その後C++11で「自動型推論」という独自の意味を持つようになりました。

register:レジスタへの格納を指示

register記憶クラス指定子は、そのオブジェクトをマシンのレジスタに格納すべきことをコンパイラに示唆します。ループ制御変数など頻繁に使用される変数に対して指定されることが多く、アクセス時間を最小化することによるパフォーマンス向上が期待できます。ただし、コンパイラがこの要求に従う義務はありません。多くのシステムではレジスタのサイズと数が限られているため、実際にレジスタへ配置できる変数はごくわずかです。

static:静的記憶域期間

static記憶クラスは、ローカル変数をプログラムの実行期間中ずっと存在させ続けるようコンパイラに指示します。スコープに入るたびに生成され、抜けるたびに破棄されるのではなく、一度だけ生成されます。そのため、ローカル変数をstaticにすることで、関数呼び出しの間も値を保持できるようになります。

extern:外部リンケージによる共有

extern記憶クラス指定子を使うと、複数のソースファイルから利用できるオブジェクトを宣言できます。extern宣言によって、宣言された変数は現在のソースファイルの以降の部分で使用可能になります。この宣言は定義を置き換えるものではなく、外部で定義された変数を記述するために用いられます。

mutable:constオブジェクトでも変更可能にする

mutable記憶クラス指定子は、クラスのデータメンバーにのみ使用できます。constとして宣言されたオブジェクトの一部であっても、mutable指定されたメンバーは変更可能になります。なお、mutableはstaticやconstとして宣言された名前、あるいは参照メンバーには使用できません。

サンプルコード

class A
{
    public:
    A() : x(4), y(5) { };
    mutable int x;
    int y;
};

int main()
{
    const A var2;
    var2.x = 345;
    // var2.y = 2345;
}

この例では、var2はconstとして宣言されているため、「var2.y = 2345」という代入はコンパイラに許可されません。一方、A::xはmutableとして宣言されているため、「var2.x = 345」という代入は問題なく行えます。

  1. C#のクラスとは?定義方法と基本構造を初心者向けに解説

    C#におけるクラスの基本的な考え方C#において、クラス(class)とは、あるデータ型の設計図(ブループリント)を定義するものです。クラスをもとにして実際に生成されたデータの実体をオブジェクト(object)と呼び、これをクラスの「インスタンス」といいます。また、クラスを構成するメソッドや変数は、まとめてクラスのメンバー(members)と呼ばれます。クラスを理解することは、オブジェクト指向プログラミングを学ぶ上で最も重要な第一歩となります。クラス定義の一般的な書式クラスの定義は、キーワード class から始まり、その後にクラス名を記述します。そして、波括弧 { } で囲まれた部分がクラスの

  2. C#のクラスにおけるメンバー変数とは?意味と使い方を徹底解説

    C#におけるクラスとメンバー変数の基本C#において、クラスはメンバー変数(フィールド)とメソッド(関数)を含む「設計図」であり、そこから生成されるオブジェクトの状態や振る舞いを定義するものです。まずはクラスの基本構文を確認し、メンバー変数がどのように宣言されるのかを見ていきましょう。クラスの基本構文<アクセス修飾子> class クラス名 {    // メンバー変数    <アクセス修飾子> <データ型> 変数1;    <アクセス