1. C++对象模型基础解析
1.1 class与struct的内存等价性
在C++底层实现中,class本质上是一种带有访问控制的特殊struct。通过以下实验可以验证这一点:
cpp复制#include <iostream>
using namespace std;
class A {
int i;
int j;
char c;
double d;
public:
void print() {
cout << "i=" << i << " "
<< "j=" << j << " "
<< "c=" << c << " "
<< "d=" << d << endl;
}
};
struct B {
int i;
int j;
char c;
double d;
};
当测试这两个类型的大小时,我们会发现它们完全相同(在64位系统上通常为24字节)。这是因为:
- 内存布局遵循相同的对齐规则(通常按8字节对齐)
- 成员函数不占用对象实例的内存空间
- 访问控制修饰符(public/private等)只在编译期有效
关键发现:通过reinterpret_cast可以将类对象强制转换为结构体指针,并直接操作其内部成员,这证明运行时确实退化为纯内存结构。
1.2 成员函数的存储机制
类成员函数的存储方式有以下几个特点:
- 所有对象共享同一份成员函数代码
- 成员函数通过隐式的this指针访问对象数据
- 函数地址在编译期就已确定(非虚函数)
- 函数调用会转换为普通函数调用+this参数传递
这种设计既节省了内存(不需要每个对象保存函数副本),又保证了执行效率(直接函数调用)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 继承机制的内存布局
2.1 单继承的内存结构
继承的本质是父类成员与子类成员的叠加:
cpp复制class Base {
protected:
int a;
int b;
};
class Derived : public Base {
int c;
};
此时Derived对象的内存布
