2016-05-24 8 views
0

ヘッダーを書き、それをテストした後、私はこのヘッダーの効率を知りたいと思っていました。ヘッダが基本的に行うことは、できるだけ効率的にマップを格納することです。 Map.SetValue()は座標を格納し、Map.GetValueは座標を取得します。座標は2次元ベクトルに格納され、4つの値が1つのcharに格納されます(値ごとに4つの可能性があります)。C++:クラスインスタンスのサイズを取得

私はこのコードを使用して、クラスのサイズを取得しようとしました:

(MapStorageは、クラスの名前であるとしてMapStorage地図、クラスのインスタンスを作る)

int main() 
{ 
    MapStorage Map; 

    int Coords[2]; 
    int Value; 
    int Size; 
    float Efficiency; 

    for (int i = 0; i < 100; i += 1){ 
     for (int x = 0 + 10*i; x < 10 + 10*i; x += 1){ 
      for (int y = 0; y < 10; y += 1){ 
       Coords[0] = x; 
       Coords[1] = y; 
       Value = rand()%4; 
       Map.SetValue(Coords, Value); 
      } 
     } 

     Size = sizeof(Map); 
     Efficiency = Size/float(i+1); 

     std::cout << "Size at " << i+1 << " Square meters: " << Size << ", Effficiency: " << Efficiency << std::endl; 
    } 

    return 0; 
} 

しかし、何が起こることはありますこれは常にサイズが20バイトであることを表示しますが、i = 99ではサイズは少なくとも2,5kb(100平方メートル、100値/平方メートル、100 * 100 = 10000、1バイトあたり4値、10,000/4 = 2,500バイト)。

質問は何ですか:私は間違っていますか?どのようにsizeofの作品を理解していないか、それはクラスとは違った働きをしますか?私は同じ問題を抱えた他の人たちを探していましたが、私の問題に当てはまる解決策を見つけることができませんでした。

種類に関して、 害

ノート:
私はunsigned char型の2次元ベクトルとしてマップを格納します。静的として宣言されていません。

+2

'sizeof'の定義をお読みください、あなたの前提に欠陥がある理由を教えてくれるでしょう。 –

+0

'MapStorage'とは何ですか? 'sizeof(map)'を実行しても、マップ内の項目の数は表示されず、オブジェクトのサイズ(メンバ変数と可能な仮想テーブルとパディングを含む)だけが表示されます。なぜあなたはどう思う? ['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)には[' size() '](http://en.cppreference.com/w/cpp)があります。/container/vector/size)メンバ関数? * size *という用語が何か他のものを意味する場合、あなたが望むように、なぜsizeof演算子が自動的にそれをユーザ定義型から計算できると思いましたか? –

+1

sizeof on pointerはポインティのサイズを返しません – Incomputable

答えて

1

sizeofは実行時ではなくコンパイル時です。コンパイル時に評価される式は、コンパイラによって置き換えられ、結果はsizeofになります。それが理由です、あなたがこれを行うことができます:として置き換えられます

char bytes [ sizeof(int) ]; 

(あなたのコンパイラ/プラットフォーム上intのサイズが4の場合):

char bytes [ 4 ]; 
+0

これは今、感謝します。ありがとう –

関連する問題