C++对象的内存模型涉及对象的数据成员(包括静态成员和非静态成员)、成员函数以及虚函数表等在内存中的布局和管理方式。以下是C++对象的内存模型的主要组成部分:
1. C++对象的组成
一个C++对象通常由以下几个部分组成:
- 非静态数据成员
对象的核心组成部分,每个对象都有自己的一份独立数据,存储在内存中。 - 静态数据成员
属于类本身,而不是任何具体的对象,所有对象共享同一份内存。 - 成员函数
不存储在对象的内存中,而是存储在代码段中。所有对象共享同一份成员函数代码。 - 虚函数表指针(vptr)
如果类有虚函数,每个对象会包含一个指向虚函数表(vtable)的指针,通常作为对象的一部分存储。
2. 内存布局
C++对象在内存中的布局大致如下:
a. 普通类对象(无虚函数)
对于没有虚函数的普通类对象,内存中只包含非静态数据成员,按照它们的声明顺序分配空间(编译器可能会对齐数据以优化性能)。
class A {int x; // 4字节(假设int是4字节)char y; // 1字节,但会对齐为4字节
};int main() {A obj; // 占用8字节:4字节x + 1字节y + 3字节对齐
}
b. 有虚函数的类对象
如果类中有虚函数,每个对象会额外增加一个虚函数表指针(vptr)。虚函数表存储在类的静态存储区域中,所有对象共享该表。
class B {int x;