前言:
想通俗的讲解一下结构体的内存怎么计算,所以再次写了一篇这样的文章,想将这个知识点描述得更加容易理解
正文:
首先我们要知道结构体内存计算与编译器的默认对齐数有关,一般windows环境默认对齐数为8,linux默认对齐数为4
1.结构体内存对齐的基准取内存最大的变量的字节数与默认对齐数的较小值。
2.结构体的总内存必须是内存最大的变量的整数倍数。
例:在linux环境下,默认对齐数为4
struct A
{
char a;
int i;
char b;
};
分析:默认对齐数为4,而结构体中内存最大的为int类型,为4个字节,所以对齐的基准为4,并且结构体的内存必须是4的倍数。
放下一个变量a后,使用了一个字节,因为基准是4,还剩下三个字节放不下i了,所以要浪费3个字节,在浪费的3个字节后放入i
然后放入b,现在总字节数为1+3+4+1=9,因为总字节数要为4的倍数,所以最终大小为12.
3.其他成员变量要对齐到某个数组(对齐数)的整数倍的地址处
这句话怎么理解呢
一个例子哈
struct A
{
int i;
char c;
short s;
}
由上面的知识很容易我们知道A内存大小为8
但是内部成员怎么分布呢
不是这样的
而是这样的
即其他成员变量要对齐到某个数组(对齐数)的整数倍的地址处
未完。。。