面试题答案
一键面试- 内存布局情况:
- 在默认情况下,结构体的内存布局遵循内存对齐原则。假设
MyStruct
结构体从内存地址0x1000
开始。 char a
:char
类型占1个字节,它的起始地址为0x1000
。int b
:int
类型通常在32位和64位系统中占4个字节。由于内存对齐原则,int
类型需要4字节对齐,a
占1字节,为了满足b
的4字节对齐,a
后面会填充3个字节,所以b
的起始地址为0x1004
。short c
:short
类型占2个字节,short
类型通常2字节对齐,b
占4字节,c
的起始地址为0x1008
。- 结构体整体占用的内存大小:
a
占1字节,填充3字节,b
占4字节,c
占2字节,总共是1 + 3+4 + 2=10
字节,但是结构体的大小需要是其最大对齐成员(这里是int
,4字节对齐)的整数倍,所以结构体整体占用12字节。
- 在默认情况下,结构体的内存布局遵循内存对齐原则。假设
- 内存对齐原则的应用:
- 自然对齐原则:每个数据成员的起始地址必须是该成员自身大小的整数倍。例如
int b
要求4字节对齐,short c
要求2字节对齐。 - 结构体整体对齐:结构体的大小必须是其最大对齐成员大小的整数倍。在这个例子中,最大对齐成员是
int
(4字节对齐),所以结构体大小最终为12字节。
- 自然对齐原则:每个数据成员的起始地址必须是该成员自身大小的整数倍。例如
- 优化内存使用 - 调整结构体成员顺序:
- 可以将成员变量按照大小从大到小排序,即
typedef struct { int b; short c; char a; } MyStructOptimized;
。 - 此时,
int b
起始地址为0x1000
(占4字节),short c
起始地址为0x1004
(占2字节),char a
起始地址为0x1006
(占1字节),结构体整体大小为4 + 2+1 = 7
字节,由于要满足4字节对齐(int
的对齐要求),所以结构体大小为8字节,相比原来的12字节,优化了内存使用。
- 可以将成员变量按照大小从大到小排序,即