2010-01-14

C++: クラスのサイズ

これをググったのももう何度目かなので、いい加減メモっておこう。

C言語のstructは基本中身のバイト数の合計+パディングになる。例えば下記のような構造体があったとする。
struct Sample {
  int   value1;
  char  value2;
  short value3;
};
この場合だと上記の基本に当てはめて、
int = 4, char = 1, short = 2, total = 7になるが、
7だとキリが悪い(あまりいい表現ではないが)ので、パディングがcharとshortの間に入って8になる。
(詳しくは、バイト境界とか、アライメントとかでググって)

っで、C++の話。
C++のクラスはC言語の構造体と違ってメンバ関数を持つことができる。これが曲者。
例えばこんなクラスがあったとする。
class {
  public:
    void print();
  private:
    int value;
};
この場合は、クラスのサイズは4になる。なぜか?
どれだけメンバ関数が足されてもサイズには影響が無いそうだ。実際、GCCの-Sオプションで吐き出されるアセンブリを見たらなんとなく納得した。

っが、仮想関数が入ってくると別の話。
仮想関数はvtblを不可視のメンバ関数として持つので、そのポインタアドレス分増える。つまり4バイト。

なんでこんなことを調べたかというと、メンバ関数を持つクラスを普通の構造体として扱いたかったから。まったく普通なら問題なんだけど、メモリの内容を直接(例えばmemcpyとか)クラスの中に移したかった。
そうすると、クラスのサイズが重要になるので。
それだけの話。

No comments:

Post a Comment