C ++:関数内の静的変数宣言

c++ function heap static-variables
C ++:関数内の静的変数宣言

静的変数は、少なくともメモリの観点から(スコープではなく)関数の外側に存在しますか? しかし、私が常に心配していたことの1つは、関数を2回目に呼び出すとどうなるかです。 例えば:

f(){
    static char buffer[256*256];
    stuff(buffer);
}

この関数を2回呼び出すと、技術的には変数 ‘buffer’を2回宣言することになりませんか? または、すべてがコンパイルされると、(通常の変数とは対照的に)静的変数で異なる動作をしますか?

  1. 私は時々、チャートやC ++の何かがあればいいのにと思います
    コンパイラは通常、コードを(マイナス最適化)に変換するので、このような小さな質問で良い人を煩わせる必要はありません。 前もって感謝します!

編集:私はそれがこのように動作することを知っている、しかし、私はただ理由を知りたいだけです。 多分それは麻痺するほど単純な心です…​

  1  1


ベストアンサー

いいえ、「静的」とは、関数のスコープ外であることを意味します。 書き込みと同じ効果があります。

static char buffer[256*256];

f(){
    stuff(buffer);
}

ただし、バッファは関数のスコープ内でのみ表示され、コードは読みやすくなります。

(注:charがプリミティブ型でない場合、私の例は適用されません。その場合、「宣言」されたときに初めて構築されます)。

3


関数スコープ内の静的ストレージ期間オブジェクト。

これらのオブジェクトは、最初の使用時に作成されます。 +次に、作成の逆の順序で(他の静的ストレージ期間オブジェクトを使用して)破棄します。

#include

class X
{
    public:
        X(int x): m(x)      {std::cout << "X: " << m << " created\n"; }
        ~X()                {std::cout << "X: " << m << " destroyed\n";}

    private:
        int m;
};


static X    x1(1);

int test()
{
    std::cout << "Test: Start\n";
    static  X x3(3);

    std::cout << "Test: Finished\n";
    return 5;
}


int main()
{
    std::cout << "Main: Start\n";
    X   x2(2);

    test();

    X   x4(4);
    std::cout << "Main: Finished\n";
}

今すぐお試しください:(コメントが追加されました)。 SSDO ⇒静的ストレージ期間オブジェクト。

g++ X.cpp
./a.out
X: 1 created    // SSDO file scope.
Main: Start
X: 2 created
Test: Start
X: 3 created    // SSDO created on first use (Notice not destroyed)
Test: Finished
Test: Start     // Notice not created here.
Test: Finished
X: 4 created
Main: Finished
X: 4 destroyed
X: 2 destroyed  // Main now really finished. after destroying local variables.
X: 3 destroyed  // Destroy SSDO in reverse order of creation. (3 - 1)
X: 1 destroyed

3


このコンテキストでは、「静的」は変数にアプリケーションの有効期間があることを意味します。 [line-through] * main() *が関数に入る前に割り当てられ、 `main()`が戻った後に割り当て解除されます。 また、その値は関数呼び出し間で保持されます。 その関数の内部からのみ表示されるグローバル変数と考えてください。

1


変数は、関数を呼び出す前後に存在します…​静的です。

0


この例はそれを説明するかもしれません:

#include
using namespace std;

void test() {
  static int i = 123;
  if (i == 123) {
    i = 321;
  }
  cout << i << endl;
}

int main(int arg, char **argv) {
  test();
  test();
  return 0;
}

出力は以下のとおりです。

321

321

したがって、「i」は、いわば、最初に遭遇したときにのみ初期化されます。 しかし、実際にはコンパイル時にその関数に割り当てられます。 その後、それは変数として関数test()のスコープ内にありますが、静的であるため、将来のtest()の呼び出しでも変更されます。

0


タイトルとURLをコピーしました