(1) struct S1
{
short s;
char c;
int i;
char d;
};
(2) struct S2
{
int i;
short s;
char c;
char d;
};
(3) struct S3
{
char c;
short s;
int i;
char d;
};
(4) struct S4
{
short s[3];
char c;
};
(5) struct S5
{
char c[3];
short *s;
int i;
char d;
double e;
};
(6) struct S6
{
struct S1 c[3];
struct S2 *s;
char d;
};
GPT#
基本规则:#
- 对齐规则:
- 每个成员的地址必须是其类型大小的倍数(如
int 对齐到 4 字节,short 对齐到 2 字节)。
- 结构总大小必须是最大对齐要求的倍数。
- 填充规则:
- 如果下一个成员的起始地址不满足对齐要求,会插入填充字节(padding)。
分析结果:#
(1) struct S1 { short s; char c; int i; char d; };#
| 成员 | 类型 | 偏移量 | 填充 | 说明 |
|---|
s | short | 0 | 0 | 占 2 字节,对齐到 2 |
c | char | 2 | 1 | 占 1 字节,对齐到 1 |
i | int | 4 | 0 | 占 4 字节,对齐到 4 |
d | char | 8 | 3 | 占 1 字节,对齐到 1 |
- 总大小:12 字节(最大对齐单位为 4)。
- 对齐要求:4 字节。
(2) struct S2 { int i; short s; char c; char d; };#
| 成员 | 类型 | 偏移量 | 填充 | 说明 |
|---|
i | int | 0 | 0 | 占 4 字节,对齐到 4 |
s | short | 4 | 0 | 占 2 字节,对齐到 2 |
c | char | 6 | 0 | 占 1 字节,对齐到 1 |
d | char | 7 | 1 | 占 1 字节,对齐到 1 |
- 总大小:8 字节(最大对齐单位为 4)。
- 对齐要求:4 字节。
(3) struct S3 { char c; short s; int i; char d; };#
| 成员 | 类型 | 偏移量 | 填充 | 说明 |
|---|
c | char | 0 | 1 | 占 1 字节,对齐到 1 |
s | short | 2 | 0 | 占 2 字节,对齐到 2 |
i | int | 4 | 0 | 占 4 字节,对齐到 4 |
d | char | 8 | 3 | 占 1 字节,对齐到 1 |
- 总大小:12 字节(最大对齐单位为 4)。
- 对齐要求:4 字节。
(4) struct S4 { short s[3]; char c; };#
| 成员 | 类型 | 偏移量 | 填充 | 说明 |
|---|
s | short[3] | 0 | 0 | 占 6 字节,对齐到 2 |
c | char | 6 | 1 | 占 1 字节,对齐到 1 |
- 总大小:8 字节(最大对齐单位为 2)。
- 对齐要求:2 字节。
(5) struct S5 { char c[3]; short *s; int i; char d; double e; };#
| 成员 | 类型 | 偏移量 | 填充 | 说明 |
|---|
c | char[3] | 0 | 1 | 占 3 字节,对齐到 1 |
s | short* | 4 | 0 | 占 4 字节,对齐到 4 |
i | int | 8 | 0 | 占 4 字节,对齐到 4 |
d | char | 12 | 3 | 占 1 字节,对齐到 1 |
e | double | 16 | 0 | 占 8 字节,对齐到 8 |
- 总大小:24 字节(最大对齐单位为 8)。
- 对齐要求:8 字节。
(6) struct S6 { struct S1 c[3]; struct S2 *s; char d; };#
| 成员 | 类型 | 偏移量 | 填充 | 说明 |
|---|
c | S1[3] | 0 | 0 | S1 每个 12 字节,共 36 字节 |
s | struct S2* | 36 | 0 | 占 4 字节,对齐到 4 |
d | char | 40 | 3 | 占 1 字节,对齐到 1 |
- 总大小:44 字节(最大对齐单位为 4)。
- 对齐要求:4 字节。
结果总结:#
| 结构体 | 成员偏移量 | 总大小 | 对齐要求 |
|---|
S1 | 0, 2, 4, 8 | 12 | 4 字节 |
S2 | 0, 4, 6, 7 | 8 | 4 字节 |
S3 | 0, 2, 4, 8 | 12 | 4 字节 |
S4 | 0, 6 | 8 | 2 字节 |
S5 | 0, 4, 8, 12, 16 | 24 | 8 字节 |
S6 | 0, 36, 40 | 44 | 4 字节 |
Copilot#
在 IA-32/Linux 下,结构体成员的对齐要求通常是成员大小的倍数。以下是每个结构体成员的偏移量、结构体的总大小以及对齐要求。
(1) struct S1#
struct S1 {
short s; // 2 bytes
char c; // 1 byte
int i; // 4 bytes
char d; // 1 byte
};
short s:偏移量 0,大小 2,2 字节对齐
char c:偏移量 2,大小 1,1 字节对齐
int i:偏移量 4,大小 4,4 字节对齐
char d:偏移量 8,大小 1,1 字节对齐
- 总大小:12 字节(因为
int 需要 4 字节对齐)
(2) struct S2#
struct S2 {
int i; // 4 bytes
short s; // 2 bytes
char c; // 1 byte
char d; // 1 byte
};
int i:偏移量 0,大小 4,4 字节对齐
short s:偏移量 4,大小 2,2 字节对齐
char c:偏移量 6,大小 1,1 字节对齐
char d:偏移量 7,大小 1,1 字节对齐
- 总大小:8 字节(因为
int 需要 4 字节对齐)
(3) struct S3#
struct S3 {
char c; // 1 byte
short s; // 2 bytes
int i; // 4 bytes
char d; // 1 byte
};
char c:偏移量 0,大小 1,1 字节对齐
short s:偏移量 2,大小 2,2 字节对齐
int i:偏移量 4,大小 4,4 字节对齐
char d:偏移量 8,大小 1,1 字节对齐
- 总大小:12 字节(因为
int 需要 4 字节对齐)
(4) struct S4#
struct S4 {
short s[3]; // 6 bytes
char c; // 1 byte
};
short s[3]:偏移量 0,大小 6,2 字节对齐
char c:偏移量 6,大小 1,1 字节对齐
- 总大小:8 字节(因为
short 需要 2 字节对齐)
(5) struct S5#
struct S5 {
char c[3]; // 3 bytes
short *s; // 4 bytes
int i; // 4 bytes
char d; // 1 byte
double e; // 8 bytes
};
char c[3]:偏移量 0,大小 3,1 字节对齐
short *s:偏移量 4,大小 4,4 字节对齐(因为指针需要 4 字节对齐)
int i:偏移量 8,大小 4,4 字节对齐
char d:偏移量 12,大小 1,1 字节对齐
double e:偏移量 16,大小 8,8 字节对齐
- 总大小:24 字节(因为
double 需要 8 字节对齐)
(6) struct S6#
struct S6 {
struct S1 c[3]; // 3 * 12 bytes = 36 bytes
struct S2 *s; // 4 bytes
char d; // 1 byte
};
struct S1 c[3]:偏移量 0,大小 36,4 字节对齐(因为 struct S1 需要 4 字节对齐)
struct S2 *s:偏移量 36,大小 4,4 字节对齐
char d:偏移量 40,大小 1,1 字节对齐
- 总大小:44 字节(因为
struct S1 需要 4 字节对齐)
总结:
struct S1:总大小 12 字节,4 字节对齐
struct S2:总大小 8 字节,4 字节对齐
struct S3:总大小 12 字节,4 字节对齐
struct S4:总大小 8 字节,2 字节对齐
struct S5:总大小 24 字节,8 字节对齐
struct S6:总大小 44 字节,4 字节对齐
(1) struct S1 { short s; char c; int i; char d; };
(2) struct S2 { int i; short s; char c; char d; };
(3) struct S3 { char c; short s; int i; char d; };
(4) struct S4 { short s[3]; char c; };
(5) struct S5 { char c[3]; short *s; int i; char d; double e; };
(6) struct S6 { struct S1 c[3]; struct S2 *s; char d; };