看下面一个例子:
它的内存模型大致如下 :
我们稍微分析一下 :
a起始地址为0 ,满足内存对齐原则,最少占用4个字节。
b起始地址为4 ,满足内存对齐原则,最少占用4个字节。
c起始地址为8 ,满足内存对齐原则, 最少占用8个字节。
d起始地址为16,满足内存对齐原则, 最少占用1个字节,但是下一个域e的起始地址必须为sizeof(float) = 4
的倍数,因此d占用了4个字节的内存,有3个字节的内存被“浪费”了。
e起始地址为20 ,满足内存对齐原则,最少占用4个字节。
f起始地址为24 ,满足内存对齐原则,最少占用1个字节,但是下一个域g的起始地址必须为sizeof(long long) = 8
的倍数,因此f占用8个字节的内存,有7个字节的内存被“浪费”了。
g起始地址为32,满足内存对齐原则,最少占用8个字节。
h起始地址为40,满足内存对齐原则,最少占用4个字节,但是为了满足8字节对齐原则(因为整个结构体中单个域占用的最大内存为8),因此h会占用8个字节,有4个字节的内存被“浪费”了。