C++初阶2--2 https://developer.aliyun.com/article/1424514
3-4,类对象模型
1,类对象的存储方式
类存储的规则是这样的,类中的变量是存储在类中,但类中的函数没有存储在类中,而是存放在专门的类成员函数表中。如图:
明白了以上知识后,我们需要注意的是以下代码。
#include <iostream> using namespace std; class A { public: void Print() { cout << "Print()" << endl; } void Print2() { cout << _a << endl; } private: int _a; }; int main() { A* p = nullptr; p->Print();//此程序将正常运行,因为成员函数没有存储在类中 p->Print2();//将运行崩溃,因为成员函数中有成员对象,成员对象在类中,此时类指针为nullptr return 0; }
2,类的大小
上面我们说过类的存储方式,那么一个类的大小,实际就是该类中”成员变量”之和,要注意的是内存对齐情况和空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。(内存对齐在之前C语言中结构体存储的那章博客上就有详细说明,在这里我们做简单的介绍,若有不明白的可观看本人之前的那章博客)。
内存对齐规则:
1,第一个成员在与结构体偏移量为0的地址处。
2,其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。VS中默认的对齐数为8。
3,结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4,如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
演练代码如下:
#include <iostream> using namespace std; class Person { public: void Student(char* name1, char* gender1, int age1); char name[20]; int age; char gender[3]; }; class Person1 {}; int main() { Person a1; Person1 a2; cout << sizeof(a1) << endl;//输出28 cout << sizeof(a2) << endl;//输出1 return 0; }