面试题答案
一键面试Final类实例的内存布局
在64位系统下,使用#pragma pack(4)
自定义对齐方式,分析Final
类的内存布局:
- Base1部分:
private: int a
:int
通常为4字节,按4字节对齐。protected: char b
:char
为1字节,按4字节对齐,需填充3字节达到4字节对齐。public: float c
:float
为4字节,按4字节对齐。Base1
类大小为4 + 4 + 4 = 12字节(由于#pragma pack(4)
,每个成员按4字节对齐,char
后填充3字节)。
- Intermediate部分:
int d
:int
为4字节,按4字节对齐。Intermediate
类继承自Base1
,其大小为12 + 4 = 16字节。
- Final部分:
private: double e
:double
为8字节,按4字节对齐,需填充4字节达到8字节对齐。public: bool f
:bool
为1字节,按4字节对齐,需填充3字节达到4字节对齐。Final
类继承自Intermediate
,其大小为16 + 8 + 4 = 28字节(总大小为28字节,因为对齐方式为4字节,double
后填充4字节,bool
后填充3字节)。
内存占用优化
- 调整成员顺序:将成员按照占用字节数从大到小排列,可减少填充字节。例如,将
Final
类成员顺序调整为double e
、float c
、int a
、int d
、char b
、bool f
。double e
:8字节,按4字节对齐,无需填充。float c
:4字节,按4字节对齐,无需填充。int a
:4字节,按4字节对齐,无需填充。int d
:4字节,按4字节对齐,无需填充。char b
:1字节,按4字节对齐,需填充3字节。bool f
:1字节,按4字节对齐,需填充3字节。- 调整后
Final
类大小为8 + 4 + 4 + 4 + 4 + 4 = 28字节(原布局也是28字节,但在更复杂情况下,此调整可能优化内存)。
struct Final
与class Final
的异同
- 内存布局:
- 相同点:在这种继承结构下,内存布局是相同的。因为
struct
和class
在继承和成员布局上遵循相同的规则,只是默认访问修饰符不同(struct
默认public
,class
默认private
),而这里显式指定了访问修饰符,所以内存布局不受影响。 - 不同点:理论上,如果没有显式指定访问修饰符,
struct Final
中继承自Intermediate
的成员默认是public
,class Final
中继承自Intermediate
的成员默认是private
。但在本题中显式指定了访问修饰符,所以在内存布局上没有不同。
- 相同点:在这种继承结构下,内存布局是相同的。因为
- 优化情况:
- 相同点:优化方式和效果是相同的。因为内存布局相同,调整成员顺序的优化策略对两者同样适用。
- 不同点:无本质不同,因为优化主要基于内存对齐和成员顺序,与
struct
和class
的默认访问修饰符无关,本题又显式指定了访问修饰符。