结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。
首先需要知道偏移量的定义,结构体变量中成员的地址和结构体变量地址的差值。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址,因此,第一个成员的偏移量为0。
计算结构体大小的规则:
- 每一个成员的偏移量都必须是该成员的倍数。
- 结构体的大小必须是该结构体字节数最大成员的倍数。
struct A{
char a;
};
sizeof(A) 大小是1;计算方法0(偏移量)+1(变量的大小);
struct A{
char a;
int b;
};
sizeof(A) = 8;
变量 偏移量 变量大小
a 0 1
b 1+3 4
struct A{
char a;
int b;
virtual fun(){}
};
sizeof(A) = 12
变量 偏移量 变量大小
vfptr 0 4
a 4 1
b 5+3 4
struct A{
char a;
int b;
void function(){}
};
sizeof(A) = 8;
变量 偏移量 变量大小
a 0 1
b 1+3 4
struct A{
char* a;
char b;
short c;
};
sizoef(A)=8;
变量 偏移量 变量大小
a 0 4
b 4 1
c 5+1 2
64位系统大小是多少
struct A {
const char* a;
unsigned char b;
short c;
};
变量 偏移量 变量大小
a 0 8
b 8 1
c 9+1+4 2
9+1满足是2的倍数(满足条件1),但是结构体中最大的是8,所以还需要+4,才是8的倍数(这样满足条件2)