规则
一、成员变量内存相对起始位置为数据类型所占内存的整数倍(例如:int 类型数据相对起始位置必须是结构体中4字节的整数倍),若不足则需要对齐不足部分的内存(内存补充给前一个变量)。
二、结构体所占总内存为其成员变量中所占空间最大数据类型的整数倍。
三、结构体中每个成员相对于结构体起始地址的偏移量必须是该成员大小的倍数。
其中,最宽基本类型指的是 long double、double 和 long long 中占用空间最大的类型。如果结构体中没有这些类型的成员,则以 int 或者 char 作为最宽基本类型。
以下是一个示例,展示了一个结构体的内存对齐过程:
struct example {
char a; // 1 byte
int b; // 4 bytes
double c; // 8 bytes
short d; // 2 bytes
};
根据内存对齐规则,该结构体中的成员变量将按照以下方式进行排列:
------------------------|------------------------|
| char a | padding (3 bytes) |
|------------------------|------------------------|
| int b | |
|------------------------|------------------------|
| double c | |
|------------------------|------------------------|
| short d | padding (6 bytes) |
|------------------------|------------------------
分析
由于 int 和 double 的大小都是 4 的倍数和 8 的倍数,因此它们的偏移量和结构体总大小都可以被 4 和 8 整除,而 short 的大小为 2,因此需要填充 6 个字节以满足偏移量为 8 的要求。
示例
#include <stdio.h>
typedef struct
{
unsigned char a;
unsigned int b;
unsigned char c;
} debug_size1_t;
typedef struct
{
unsigned char a;
unsigned char b;
unsigned int c;
} debug_size2_t;
int main(void)
{
printf("debug_size1_t size=%lu,debug_size2_t size=%lu\r\n", sizeof(debug_size1_t), sizeof(debug_size2_t));
return 0;
}
结果:
debug_size1_t size=12,debug_size2_t size=8
分析:
1.debug_size1_t 存储空间分布为a(1byte)+空闲(3byte)+b(4byte)+c(1byte)+空闲(3byte)=12(byte)。
1.debug_size2_t 存储空间分布为a(1byte)+b(1byte)+空闲(2byte)+c(4byte)=8(byte)。