面试题答案
一键面试- B类内存布局
- B类对象的内存布局中,首先是从基类A继承而来的部分(由于A为空类,在C++标准下通常会有一个“空基类优化”,其大小理论上为1字节,用于标识对象的地址唯一性)。
- 接着是B类自己定义的int类型成员变量,int通常在32位和64位系统下占4字节。
- 大小计算方式
- 在一般情况下(不考虑特殊编译器优化),B类对象的大小为A类大小(1字节,因空基类优化)加上int类型成员变量的大小(4字节),总共为4 + 1 = 5字节。但在实际中,由于内存对齐的原因,编译器通常会将其对齐到4字节的倍数,所以B类对象大小通常为8字节。
- C++对象模型中的原理
- 继承原理:在C++对象模型中,派生类对象包含基类对象的所有成员(包括被隐藏的成员)。所以B类对象的内存布局是在基类A对象布局之后,紧接着放置B类自己新增的成员。
- 空基类优化:对于空基类A,C++标准允许编译器进行空基类优化(EBO),以节省空间。这是因为空类本身没有数据成员,不需要占用实际的存储空间,但为了保证每个对象都有唯一的地址,编译器会给它分配一个最小的非零大小(通常是1字节)。
- 内存对齐:为了提高内存访问效率,编译器会按照一定的规则对对象中的成员进行内存对齐。比如在常见的系统中,会按照4字节或者8字节的边界对齐。所以即使B类理论大小为5字节,实际也会被对齐到8字节。