::Hikaru's blog

調べたこと, 考えたことをメモ.
<< November 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

- | permalink | - | -
<< _mm_malloc | main | confirm, prompt >>

構造体にナゾの隙間

以下のような構造体Bを定義すると、ナゾの隙間ができる。 struct A { virtual void funcA() {} }; struct B : virtual A { B() {} virtual void funcA() {} }; 構造体Bのレイアウト 0+-----+ |vbptr| 4+-----+ | 0 | ← ????? 8+-----+ |vfptr| 12+-----+

Bのコンストラクタを書かなかったり、B::funcA()を書かなかったりすると隙間はなくなる。
Bにメンバ変数を追加すると、その分のサイズが伸びるので、単純にパディングというわけでは無さそう。
謎である。(VC++7, VC++9で確認)
C, C++ | permalink | comments(3) | trackbacks(0)

スポンサーサイト

- | permalink | - | -

この記事に対するコメント

構造体Bにintのメンバ変数を1つ追加するとどういうレイアウトになるの?
Akihiro | 2008/12/01 3:34 PM
謎の領域の前に、intの4バイトの領域が追加され、sizeof(B)==16になります。
hikaru | 2008/12/01 6:39 PM
関数のポインタの4バイトですよ。

virtual void funcA() {}

バーチャルなので実体がどのアドレスにあるかを、4バイトのポインタで持っています。
ふくちゃん | 2010/01/13 9:55 AM
コメントする









この記事のトラックバックURL
http://hikarukaru.jugem.cc/trackback/107
この記事に対するトラックバック