一些定义:
偏移量: 结构体中的该变量前面占用的字节数
成员变量对齐参数: 结构体中该变量的大小
结构体整体的对齐参数: 结构体中最大的成员变量的对齐参数
计算规则:
- 每一个成员的偏移量都必须是该成员的倍数。
- 结构体的大小必须是结构体整体的对齐参数的倍数。
例:
#include<iostream>
using namespace std;
struct TestStruct
{
char c;
int i;
short s;
};
int main(){
cout << sizeof(TestStruct);
}
- c的偏移量是0,因为前面没有,c的对齐参数是1,因为是char类型,所以到c为止偏移量等于0+1=1
- i的偏移量是1,因为前面有c,i的对其参数是4,因为是int类型,但是要满足计算规则1所以要给c后面填充3个字节i从第四个字节开始计算,最终到i为止偏移量对于1+3+4=8
- s的偏移量是8,因为前面是c和i,s的对其参数是2,因为是short类型,8是2的整数倍,满足计算规则1,所以到s为止8+2=10
- 当所有成员计算完后,要满足计算规则2,结构体整体的对齐参数为4,因为int=4,short=2,char=1,取max,10不是4的倍数,最小是12是4的倍数,所以最后结构体大小为 12
一些补充:
- 对于C++的类大小计算和结构体一致
- 对于结构体中嵌入结构体来说,视为其展开就行,只需注意一点:展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍,其他不变
- 对于C++11中支持了自定义对齐参数了:# pragma pack(8) ,每个成员的偏移量只要是8的倍数就行
- static变量,直接忽略,不计入结构体大小