0

次のコードスニペット。静的メンバー変数マップは、デフォルトのコンストラクターを使用して初期化されます。

#include <iostream>
#include <map>
using namespace std;

class A
{
 static map<int, int> m_map; //static member variable

 public:
 void PrintSize()
 {
     //accessing it
     //so that the map gets into the executable
     cout < m_map.size() << endl;
 }
};

// Initializing the static map member variable
map<int, int> A::m_map = map<int, int>();

int main()
{
     A a;
     cout << sizeof(a) << endl;
     a.PrintSize();

     return 0;
}

プログラムは正常に実行されます。私の質問は、保存されている静的マップを初期化するために形成される一時変数はどこにあるのかということです。

4

4 に答える 4

3

完全な式の最後で破棄される限り、コンパイラーがそれを置きたいところはどこでも。通常、これは、コンパイラによって生成された初期化関数のスタック上にあります。これは、の前に呼び出され mainます。(実際、この特定のケースでは、コンパイラーは通常、一時的なアウェイを最適化するため、どこにもありません。)

于 2012-08-28T09:57:13.387 に答える
3

「ジェームズ」によって適切に答えられましたが、g++の場合にそれがどのように起こるかをお見せしたいと思います

答えを目的とした類似のコードを次に示します。

[Fooo@EXP]$ cat TestStatic.cpp
#include<iostream>
#include<map>
using namespace std;
class DummyStatic
{
#ifdef TEST
        static map<int,int> mymap;
#else
        map<int,int> mymap;
#endif
};
#ifdef TEST
        map<int,int> DummyStatic::mymap = map<int,int>();
#else
        //Do Nothing
#endif
int main(){
        DummyStatic obj;
}

'TEST' undefineでコンパイルし、'exe'のサイズを確認すると、これが得られます。

[Fooo@EXP]$ g++ -o TestStatic TestStatic.cpp
[Fooo@EXP]$ size TestStatic
   text    data     bss     dec     hex filename
   2724     300      12    3036     bdc TestStatic

今、私たちは「TEST」定義でそれを行います...

[Fooo@EXP]$ g++ -o TestStatic TestStatic.cpp -D TEST
[Fooo@EXP]$ size TestStatic
   text    data     bss     dec     hex filename
   2616     300      36    2952     b88 TestStatic

BSSの違いを観察する

これがあなたの質問に答えることを願っています。

于 2012-08-29T06:11:43.903 に答える
2

私はあなたがmap<int, int>()一時的なことについて尋ねていると思います。

ローカル変数を初期化する場合と基本的な違いはありません

int main()
{
    map<int, int> a_map = map<int, int>();
...
}

一時的なものは、main関数のスタック上に作成されます。

重要な初期化を必要とする静的オブジェクトが作成されると、コンパイラーは。の前に実行される関数を生成しますmain。一時的なものは、その関数のスタック上に作成されます(最適化されていない場合)。

于 2012-08-28T09:59:59.467 に答える
0

私が正しければ、静的変数がどのように格納されるかについて質問しています。静的変数はクラスのすべてのインスタンスで共有されますが、クラスの「内部」には格納され、クラスの「一部」でもありません。実際には、静的変数の割り当て方法は標準で明示的に指定されていないため、標準に従って動作する限り(オブジェクトなしで使用できるように)、さまざまな方法で実装できます。

静的クラスメンバーの動作は、グローバル変数の動作に非常に近いものです。どこかにグローバル変数があり、各クラスメンバーがそのグローバルへのポインタを持っているかのように(抽象化として、それが実際に機能する方法であるとは意図していません!)考えることができます。

SOに関するこれこの質問を読むことを検討してください。

于 2012-08-28T09:55:22.167 に答える