关于结构体的内存对齐以及嵌套结构体的内存计算

1,214 阅读2分钟

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.