8中基本类型所占字节数
byte 1
short 2
int 4
long 8
float 4
double 8
char 2
bool 1
前面的地址必须是下一个大小的整数倍
比如前面是0 ~ 11,下一位是一个char类型的变量,只占1个字节,第12位是1字节的整数倍,那么第12位就可以存放这个变量。再下一位是一个int型的变量,占4个字节,此时0~12位存放了数据,往下第13位不是4的倍数,必须补齐到最近的16才可以,那么就需要从16位开始存:16,17,18,19
整个Struct的地址必须是最大字节的整数倍
如果最后计算大小是14,最大的变量大小是4,那么整个必须是4的倍数才行,最后大小为16。
内嵌结构体需要展开计算
在计算内存大小的时候,内嵌结构体的变量都被解包放在最外层计算。就像多维数组转为一维数组一样。
计算一个结构体的大小
struct Foo {
int a; // 占4个字节 0,1,2,3
double b; // 占8个字节,4不是8的倍数,所以要从8开始 8,9,10,11,12,13,14,15
short c; // 占2个字节 16,17
char d; // 占2个字节 18,19
}
计算出的大小是20,但是总大小必须是最大字节的整数倍,所以是24.
内嵌结构体大小
struct Soo {
double a;
int b;
char c;
struct Foo f;
}
在计算的时候,会把Foo类型的变量都拿到最外层,就会变成下面这样
struct Soo {
double a; // 0,1,2,3,4,5,6,7
int b; // 8,9,10,11
char c; // 12,13
int fa; // 16,17,18,19
double fb; // 24,25,26,27,28,29,30,31
short fc; // 32,33
char fd; // 34,35
}
计算出的大小是36,最大字节是8,所以最后是40.