本篇博客来分析C++中类成员的内存布局情况。首先我们来分析下成员函数的内存布局,然后分析下类中成员变量的内存布局。
1. 类中成员函数布局
c++类中的成员函数包括有虚函数和普通成员函数。首先我们先来讨论下没有虚函数的类中成员函数是如何布局的。
(1)只含有普通成员函数的类
一个类也相当于一个作用域。对于不含虚函数的类而言,成员函数可以被看作是类作用域的全局函数,不在对象分配的空间里。也就是说类中普通成员函数对类内存大小没有影响。
那么问题来了:通过一个类对象调用成员函数,如果确定这个成员函数属于这个类呢?
对象调用成员函数时,在编译期,编译器就可以确定这些函数的地址,并通过传入this指针和其他参数,完成函数的调用,所以类中就没有必要存储成员函数的信息。
(2)含有虚函数的类
如果一个类中含有虚函数的话,在类内存中一开始就会有一个vptr(虚指针)。这个虚指针指向一个虚表,虚表是由类中指向虚函数的指针构成的数组。vptr是在类的constructor中被初始化,这是由系统决定的,我们无法改变。
类中的虚函数只能通过vptr调用。
2.类中成员变量的布局
(1)成员变量在类中内存的先后顺序与其在类中被声明的先后顺序一致,也就是说先声明的变量在内存的前边。
(2)类中成员变量初始化的先后顺序与其声明先后顺序一致,与constructor中被初始化先后顺序无关。
(3)如果类中含有虚函数,那么类中第一个位置的变量是vptr。
(4)类大小的是在编译期间就被确定了,所以sizeof可以作用与一个类名。