MST

星途 面试题库

面试题:C++复杂继承体系下虚基类对派生类内存占用的影响

有一个虚基类A,类B和类C都虚继承自A,类D同时继承自B和C。A中有一个int成员变量,B和C各有一个double成员变量,D有一个char成员变量。请详细阐述D对象的内存布局情况,包括内存对齐是如何影响最终内存占用大小的,并给出计算D对象大小的具体过程。
30.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 内存布局分析
    • 虚基类A部分
      • 由于A中有一个int成员变量,假设int占4字节(在32位和64位系统中常见)。同时,因为B和C虚继承自A,D对象中会有一个指向虚基类A子对象的虚基表指针(vptr for virtual base)。在64位系统中,指针占8字节。所以A相关部分在D对象内存布局中,先有一个8字节的虚基表指针,接着是4字节的int变量,共12字节。
    • 类B部分
      • B有一个double成员变量,double通常占8字节。
    • 类C部分
      • C同样有一个double成员变量,占8字节。
    • 类D部分
      • D有一个char成员变量,char占1字节。
  2. 内存对齐
    • 内存对齐原则是为了提高内存访问效率,数据成员存储的起始地址要对齐到该数据成员大小的整数倍。
    • 在这个例子中,最大基本数据类型是double,占8字节。所以整个D对象的内存大小要对齐到8字节的整数倍。
  3. 计算D对象大小的过程
    • 前面分析的A部分12字节,B部分8字节,C部分8字节,D部分1字节,总共是12 + 8 + 8 + 1 = 29字节。
    • 由于要对齐到8字节的整数倍,29字节向上取整到8的倍数,即32字节。

所以,D对象的大小为32字节。