我试图理解当我移动结构体变量时,为什么结构体的大小会发生变化。我知道其中涉及到填充,但是它在后台具体做了什么并不明显。
struct test1 {
long y;
int a;
short int b;
short int t;
}
sizeof(struct test1) = 16
struct test2 {
long y;
short int b;
int a;
short int t;
}
sizeof(struct test2) = 24
struct test3 {
int a;
long y;
short int b;
short int t;
}
sizeof(struct test3) = 24
我知道test1的大小为8+(4+2+2),没有填充, 但我不明白为什么test2没有返回相同的结果,即8+(2+4+2)没有填充。
第三个测试test3中我们看到int占用4字节+4个填充字节,long占用8字节,short int占用2字节+2字节+4个填充字节。
如果test3可以使两个short int变得连续,为什么test2不能使short int、int和short int变得连续?
这是否意味着我们应该始终重新排序结构体成员以最小化填充?
所以,与test2和test3相比,test1声明总是更好的吗?
编辑: 作为后续问题,
struct test4 {
char asdf[3];
short int b;
};
sizeof(struct test4) = 6
短整型(short int)不应该像数组大小为3的字符(char)一样填充到4字节吗?
char buf[4000]
是这种类型最小的尺寸,而uint64_t
则更大一些。 - David C. Rankin