MST

星途 面试题库

面试题:C++ 内存对齐与类继承关系

假设有两个类Base和Derived,Base类包含一个int成员变量和一个char成员变量,Derived类继承自Base类,并添加了一个double成员变量。请分析Derived类对象的内存布局,解释内存对齐是如何影响其大小和成员变量存储位置的,并写出计算Derived类对象大小的过程。
14.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 内存布局分析

假设Base类定义如下:

class Base {
public:
    int a;
    char b;
};

Derived类定义如下:

class Derived : public Base {
public:
    double c;
};

在C++中,派生类Derived对象的内存布局是在基类Base对象的内存布局之后,接着存放派生类新增的成员变量。即Derived对象的内存布局为:先存放Base类的int achar b,然后存放Derived类自己的double c

2. 内存对齐影响

内存对齐是为了提高CPU访问内存的效率。现代CPU通常以特定字节数(如4字节、8字节等)为单位来访问内存。如果数据存储的起始地址是该特定字节数的倍数,访问效率会更高。

  • Base类内存对齐
    • int类型通常占4字节,char类型占1字节。由于内存对齐,char b后会填充3字节,使得Base类对象大小为8字节(4 + 1 + 3)。
  • Derived类内存对齐
    • Derived类继承自Base类,Base类部分大小为8字节。double类型占8字节,其起始地址需要是8字节的倍数,刚好Base类部分大小为8字节,满足对齐要求。所以Derived类对象大小为8(Base类部分) + 8(double c) = 16字节。

3. 计算Derived类对象大小的过程

  1. 计算Base类对象大小:
    • int a:4字节。
    • char b:1字节。
    • 对齐填充:为了满足Base类整体按4字节对齐(因为int是4字节),char b后填充3字节。所以Base类对象大小为4 + 1 + 3 = 8字节。
  2. 计算Derived类对象大小:
    • Derived类继承Base类,Base类部分大小为8字节。
    • double c:8字节。
    • 由于Base类部分大小8字节满足double按8字节对齐的要求,所以Derived类对象大小为8(Base类部分) + 8(double c) = 16字节。

综上,Derived类对象大小为16字节。