オブジェクトのサイズ

sizeof.png

C++の場合

C++の場合は単純である。
クラスのメンバの数の合計がクラスのサイズになっており、
測り方はこうである

sizeof(Object);

また、プロジェクトのデフォルトの設定では8バイト区切りになっているので、
unsigned charなどの1バイトサイズのメンバが中途半端な位置にあったら、
思った通りよりも多いクラスのサイズが返ってくる。
class Miffy{
unsigned char member;
}
...
printf("Miffyのサイズは1byteだよね??→%d バイト",sizeof(Miffy));

出力結果は

Miffyのサイズは1byteだよね??→8バイト

となるのである
1バイト区切りにしたかったら、Visual Studioでいうところの構造体メンバのアライメントという項目を変える必要がある。

構成プロパティ->C/C++->コード生成->構造体メンバのアライメント

である。なぜ構造体なのか?C++ではクラスも構造体も同じ扱いだからである。
またハードコードでも変えることができる。

#pragma pack(2)//2byte境界にする

構造体のメンバをどんな区切りで読むのか?
もし、この区切りよりも小さいサイズのメンバがいたら、足りないバイト数のところは0で埋められて変なことになる。
設定する場所は

構成プロパティ->C/C++->コード生成->構造体メンバのアライメント

である。
これをちゃんとすれば、構造体を配列のように扱って、ポインタを渡す、なんてことができる。

C++ sizeofのコーディングガイドライン

sizeof(型名)ではなくsizeof(変数名)を使う

型が変更しても自動的に対応できるため

sizeofで配列全体のサイズを求める

sizeofで配列全体のサイズを求めることができます。OpenGLで頂点バッファ作るときに便利です。
しかしちょっと注意が必要です。
ポインタ変数として宣言した配列では1要素のサイズが返ってきてしまいます。
なのでstd::arrayが便利です。

#include <iostream>
#include <array>
using namespace std;
 
int main() {
    int a[] = {1,2,3};
    cout << "sizeof:"<<sizeof(a) << endl;//return 12=4*3
 
    int *b = new int[3];
    cout << "sizeof:" << sizeof(b) << endl;//return 4
 
    array<int,3> c;
    cout << "sizeof:" << sizeof(c) << endl;//return 12=4*3
    return 0;
}

Javaの場合

Javaの正解では、すべての変数は参照である(組み込み型以外)
となると、オブジェクトのサイズを知る術はヤフっても簡単にはみつからない。

  • オブジェクト参照型変数にnullを入れたら、その変数はどのオブジェクトにも対応しなくなる

らしいけど、それってサイズが0に減ったことになるのかな?

メモリのサイズを気にするのならば、

  • オブジェクトを何個作ったのか
  • 1個のオブジェクトあたりのサイズ

を気にする必要がある。
その辺りの話はガーベージコレクション参照

サポートサイト Wikidot.com