0

私は埋め込み C++ プロジェクトに取り組んでおり、可能な限りメモリを静的に割り当てる予定です。そのため、すべてのクラスとグローバルな新規/削除の新規/削除をオーバーライドする一連の関数を作成しています。

単純な実装を次に示します。

class MyClass
{
    int x;
    float y;
    double z;

    static MyClass m_preAllocatedObjects[100];  //Solution 1
    static char m_preAllocatedMemory[100 * sizeof(MyClass)]; //Solution 2
    static char* getPreAllocatedMemory() // Solution 3
    {
        static char localStaticMemory[100 * sizeof(MyClass)];
        return localStaticMemory;
    }

    static void* operator new(size_t s){ 
     void* p; /*fill p from the pre-allocated memory or object*/;
     return p;
    }
};

解決策 1 : デフォルトのコンストラクターを持つオブジェクトに対してのみ機能します。

解決策 2 : コンパイル エラーが発生しますuse of undefined type 'MyClass'これが私が尋ねていることです。

解決策 3 : この解決策は正常に機能します。

質問は:

sizeof(MyClass) を取得できないのに、MyClass の静的メンバーを作成できるのはなぜですか?

4

3 に答える 3

3

MyClassコンパイラのサイズを「知る」には、クラス全体を知る必要があります。a を前方宣言するstatic MyClass m_preAllocatedObjects[100];場合、実際には変数を定義していません。実際に変数を取得するには、次のことを行う必要があります。

MyClass MyClasss::m_preAllocatedObjects[100]; 

.cpp ファイルのどこかにあります。これは、オブジェクトのメモリがデータ セグメントの塊として「配置」される場所です。MyClassしたがって、コンパイラは、変数を宣言する時点での実際のサイズを知る必要はありません。ただし、評価するサイズを知る必要があり100 * sizeof(MyClass)ます。

于 2013-07-16T10:18:39.163 に答える
1

あなたは2つのステップでそれをしなければなりません:

  • クラス内で(サイズを知らずに)配列を宣言します。
  • クラスの宣言が終わったら、クラスを定義して、サイズがわかるようにします。

コードは次のとおりです。

class MyClass
{
     int x;
     ...
     static char m_preAllocatedMemory[];
};


char MyClass::m_preAllocatedMemory[100 * sizeof(MyClass)];
于 2013-07-16T10:25:45.647 に答える