目录
一、计算结构体的大小
二、计算类的大小
三、内存对齐
一、计算结构体的大小
计算结构体的大小要遵循内存对齐规则:即从第二个成员变量开始,起始位置要计算,在自己的大小和默认对齐数(VS编译器中默认对齐数为8)中选择较小的那个,起始位置为其倍数。最后整个结构体也必须要对齐:结构体的大小必须是默认对齐数的整数倍。
二、计算类的大小
1.计算成员变量的大小
类和结构体的一样,也遵守内存对齐规则,从第二个成员变量开始,起始位置要计算,在自己的大小和默认对齐数(VS编译器中默认对齐数为8)中选择较小的那个,起始位置为其倍数。最后整个类也必须要对齐:类的大小必须是默认对齐数的整数倍。
当sizeof计算类的大小的时候会忽略静态成员变量的大小。
2.计算成员函数的大小
算类的大小时,不用考虑成员函数,故不用加上函数指针的大小。
3.计算空类的大小
注意,没有成员变量的类(包括空类)的大小为1字节,不存储数据,目的是为了占位,标识对象存在,区分不同的对象。
总结:
计算类的大小就是按照内存对齐的方式计算类中所有(非静态)成员变量 的大小。
三、内存对齐
在编程中,内存对齐是一种提高内存访问效率的方法。简单来说,内存对齐就是将数据存储在特定的地址,这个地址是某个特定数值(对齐数)的整数倍。这样做的好处是可以提高CPU的内存访问效率,因为CPU访问内存时是按块进行的,如果数据没有对齐,CPU就需要多次访问内存才能获取到完整的数据,而如果数据对齐,CPU就可以一次访问就获取到完整的数据。
在C++中,类和结构体也会遵守内存对齐规则。每个成员变量在内存中的位置都会从其上一个成员变量结束后起始位置的某个倍数开始。这个起始位置的计算方式是:取默认对齐数(在VS编译器中默认对齐数为8)和自己的大小中的较小值,然后选择这个数的整数倍作为起始位置。
同时,整个类的大小也必须是对齐数的整数倍。这是因为如果类的大小不是对齐数的整数倍,那么在访问这个类的对象时,CPU就可能需要多次访问内存才能获取到完整的数据。
这种内存对齐的方式可以提高CPU的内存访问效率,但是它也会导致一定的内存浪费。因为即使有些成员变量之间有空隙,这些空隙也不能被利用。所以,内存对齐是一个权衡内存使用效率和内存访问效率的问题。
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。