如何计算结构体对象的大小
今天在处理结构体对象的时候,发现自己一直以为的结构体对象的内存对齐只会在最后对齐是错误的理解,于是在知乎中看了 这篇回答后,把这种错误理解纠正了过来,现在就来写个博客记录一下。
在C/C++中,结构体对象的大小不一定等于成员变量所占的内存空间之和,这是由于内存对齐的存在,在计算结构体对象的大小时需要遵循以下三个原则所导致的:
1. 结构体变量的起始地址能够被其最宽的成员大小整除
2. 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
3. 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节
我们先来看第一个例子
struct
{
int a;
char b;
char c;
}
第一个例子的结构体对象的大小是多少个字节呢?6个字节?不对,是8个字节。由于在上面的结构体当中,最宽的成员变量a占有了4个字节,根据第三个原则:结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节,6%4 != 0,所以需要在结构体的最后补齐2个字节,即8个字节。
我们再来看看第二个例子
struct
{
char a;
int b;
char c;
}
这不是跟上面第一个例子一模一样吗?只是成员变量的顺序换了。那么这个结构体对象的大小是多少个字节呢?8个?不对,是12个。
由于在第二个例子的结构体中,第一个是成员变量是char,第二个成员变量是int,所以根据第二个原则: