ak備忘録

レガシーブログ

クラスのサイズまとめ placement new / delete

何か今日改めてメモリ管理に関して理解しておくことにしたので、
ここにまとめておこうと思う。

基礎知識なので、自分用メモです。
(ちなみにポインタ変数のサイズ4バイト(32bit)で計算しています)

1、メンバ変数が何もないクラスのサイズは1バイト
2、virtualメンバを持っているクラスは4バイトサイズが増える
3、virtualメンバを複数持っていても増える量は4バイトで変わらない
4、自分にvirtualメンバがなくても
  virtualメンバを持つクラスを継承すれば4バイト増える
5、自分にvirtualメンバがあり、親クラスもvirtualメンバを持っていても
  増える量は4バイトで変わらない。
6、クラスを実体で配列化すると、そのサイズは
  クラスサイズ×配列数 になる。
7、クラスをnewで配列確保すると、そのサイズは
  クラスのサイズ×配列数+4 になる。
8、クラスをnewで配列確保すると、そのポインタの前方4バイトに
  確保した配列の個数が自動的に追加される。
9、intなどのデストラクタの概念がないものは配列数の自動追加がない。
  そのためnewで配列確保してもサイズは クラスサイズ×配列数 になる。
11、引数付きのグローバルnewやグローバルdeleteのオペレータを呼んでも
   コンストラクタとデストラクタは呼ばれる。
12、デストラクタは明示的に呼び出せる
13、コンストラクタはメモリを確保しないNULLを返すダミーnewを作ることで
   明示的に呼び出せる裏技がある。
14、引数付きのnewを定義した場合は、同じ引数付きのdeleteを定義しないと
   warningが発生する。

参考文献:
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-2.html
http://d.hatena.ne.jp/faith_and_brave/20120224/1330058808
http://www.geocities.jp/ky_webid/cpp/language/036.html