C++类的sizeof()详解与实例

需积分: 0 0 下载量 193 浏览量 更新于2024-08-04 收藏 25KB DOCX 举报
"sizeof(CChild)="<sizeof(CChild)><endl; sizeof(CChild)=12 看到这里,我们已经探索了C++中类的`sizeof`运算符的行为。`sizeof`运算符用于计算对象或类型的大小,以字节为单位。下面是对这个知识点的详细说明: 1. **空类的大小**:一个空类在内存中并不是完全不占用空间。编译器为了确保每个实例都能拥有唯一的地址,会在空类中隐式地添加一个字节,这就是为什么`sizeof(CBase)`的结果是1。 2. **成员变量的大小**:类中的成员变量会直接影响类的大小。例如,如果一个类包含一个`int`和一个`char*`,它们分别占用4个字节和4个字节(假设指针也是32位的),那么`sizeof(CBase)`将返回8。 3. **虚函数的影响**:当类中包含虚函数时,编译器会在类的每个实例中添加一个虚函数表指针(vptr),这个指针指向包含虚函数地址的表。对于32位系统,vptr通常占4个字节。因此,当我们向`CBase`添加虚函数后,`sizeof(CBase)`变为12,即原来的8字节加上4字节的vptr。 4. **继承与大小**:派生类的大小不仅包括它自己的成员,还包括从基类继承的所有成员。即使基类已经包含了vptr,派生类在32位系统下仍然会有自己的vptr,因为它可能有自己的虚函数。因此,`CChild`继承自`CBase`,并添加了一个`int`成员,但其大小仍然是12字节,因为vptr只需要一个,不会因为继承而增加。 5. **对齐和填充**:在实际的内存布局中,编译器可能会进行对齐和填充,以优化内存访问速度。这意味着即使所有成员变量的总大小不是字节的整数倍,编译器也可能会在类中填充额外的字节,以确保类的大小是特定值的倍数。在这个例子中,`CBase`和`CChild`的大小没有因对齐而增加,但需要注意的是,在其他情况下,对齐规则可能会影响`sizeof`的结果。 `sizeof`运算符的行为受到类的成员变量、虚函数、以及编译器的内存对齐策略的影响。理解这些因素可以帮助我们更好地理解和预测类在内存中的占用情况,这对于优化代码和理解内存管理至关重要。