&child.m_fuga=0x7fff5376da50まず、childの先頭アドレスとm_valは0x1Cの差があります。10進数で28byteの差があります。この実態を突き止めていきます。Base0のvtableがあるでしょう。そこにm_hogeのアドレスが続きます。次がBase1のvtableとなると予想されます。ここで、m_fugaのアドレスから逆算するとBase1のvtableは0x7fff5376da48にあるように思われます。0x7fff5376da44からの4バイトが空いています。これはアライメントの影響と考えられます。64bit環境なので、8byteアラインメントがかけられるためです。これを確認するためm_hogeの後ろにさらに4byteのメンバを足して出力してみても全く同じ結果が得られました。|となるということです。注意としてアラインメントを考慮する必要が有ることも気づけました。全部入りで、多重継承かつ継承階層2つ以上かつメンバ変数入り。&child.m_middle=0x7fff53874a44,&child.m_fuga=0x7fff53874a50はい、まぁ予想通り以下のとおりとなるということです。|基本的に想定通りの挙動となりはしましたが、この辺をちゃんと一度確認してみておかないと意外と、いざダンプを解析しようとするときに不安になってしまいます。この結果で確信をもって、ダンプ解析に励みたいと思います。以下を参照すると、コンパイラによってはコンパイルオプションでアドレスのダンプができるようで、簡単に確認できるようです。多重継承の実現方法は場合によってはコンパイラに依存する可能性があるようです。基本的には上の形となりそうですが。コメントをキャンセルメールアドレスが公開されることはありません。(1)お問い合わせタイトルとURLをコピーしました。