1. ホーム
  2. c++

[解決済み] 関数レベルの静的変数はいつ確保/初期化されるのですか?

2023-03-05 13:54:29

質問

グローバルに宣言された変数が、プログラム開始時に割り当てられる(そして、該当する場合は初期化される)ことに自信を持っています。

int globalgarbage;
unsigned int anumber = 42;

しかし、関数内で定義された静的なものについてはどうでしょうか?

void doSomething()
{
  static bool globalish = true;
  // ...
}

のスペースはいつですか? globalish のスペースはいつ確保されるのでしょうか?プログラムの起動時でしょうか。でも、そのときにも初期化されるのでしょうか?それとも、初期化されるのは doSomething() が最初に呼ばれたときに初期化されるのでしょうか?

どのように解決するには?

気になったので、以下のテストプログラムを書き、g++バージョン4.1.2でコンパイルしてみました。

include <iostream>
#include <string>

using namespace std;

class test
{
public:
        test(const char *name)
                : _name(name)
        {
                cout << _name << " created" << endl;
        }

        ~test()
        {
                cout << _name << " destroyed" << endl;
        }

        string _name;
};

test t("global variable");

void f()
{
        static test t("static variable");

        test t2("Local variable");

        cout << "Function executed" << endl;
}


int main()
{
        test t("local to main");

        cout << "Program start" << endl;

        f();

        cout << "Program end" << endl;
        return 0;
}

結果は私が期待したものとは違いました。静的オブジェクトのコンストラクタは、関数が最初に呼び出されるまで呼び出されませんでした。以下はその出力です。

global variable created
local to main created
Program start
static variable created
Local variable created
Function executed
Local variable destroyed
Program end
local to main destroyed
static variable destroyed
global variable destroyed