面试题答案
一键面试C语言内存对齐基本规则
- 数据成员对齐规则:结构体的每个数据成员,都要按照其自身的对齐模数(alignment modulus)进行对齐。对齐模数一般是数据成员自身大小和默认对齐值(通常由编译器决定,32位平台默认值常为4字节,64位平台默认值常为8字节)中的较小值。例如,一个
char
类型(1字节)数据成员,其对齐模数为1字节;一个int
类型(通常4字节)数据成员,在32位平台对齐模数为4字节,在64位平台,若默认对齐值为8字节,则其对齐模数为4字节。 - 结构体整体对齐规则:结构体本身也有一个对齐模数,它是结构体中最大数据成员的对齐模数。结构体的大小必须是其对齐模数的整数倍。
结构体示例及大小计算
#include <stdio.h>
// 定义结构体
struct MyStruct {
char a;
int b;
short c;
};
- 32位平台
char a
:1字节,对齐模数为1字节。int b
:4字节,对齐模数为4字节。a
后面需要填充3字节,使得b
从4的倍数地址开始。short c
:2字节,对齐模数为2字节。b
占用4字节后,c
从4 + 4 = 8字节处开始。c
占用2字节,此时结构体大小为10字节。- 结构体整体对齐模数为4字节(
int
的对齐模数最大),10不是4的整数倍,需要填充2字节,所以结构体大小为12字节。
- 64位平台
char a
:1字节,对齐模数为1字节。int b
:4字节,对齐模数为4字节。a
后面需要填充3字节,使得b
从4的倍数地址开始。short c
:2字节,对齐模数为2字节。b
占用4字节后,c
从4 + 4 = 8字节处开始。c
占用2字节,此时结构体大小为10字节。- 结构体整体对齐模数为4字节(
int
的对齐模数最大),10不是4的整数倍,需要填充2字节,所以结构体大小同样为12字节。
综上所述,在32位和64位平台下,该结构体MyStruct
的大小均为12字节。原因是根据内存对齐规则,结构体成员按各自对齐模数对齐,结构体整体按最大成员对齐模数的整数倍计算大小,通过填充字节来满足这些规则。