面试题答案
一键面试实际场景
在开发游戏时,可能需要大量存储游戏角色的信息。比如一个简单的游戏角色结构体,包含一个int
类型的ID(4字节),一个char
类型的性别(1字节),以及一个float
类型的生命值(4字节)。如果不考虑内存对齐,直接定义结构体如下:
struct GameCharacter {
int id;
char gender;
float health;
};
假设int
在32位系统下占4字节,char
占1字节,float
占4字节,这个结构体理论上大小为4 + 1 + 4 = 9字节。但由于内存对齐规则,实际占用内存会大于9字节。
原理
内存对齐的原理是为了提高CPU访问内存的效率。现代CPU访问内存时,通常以特定大小的块(如4字节、8字节等)进行读取。如果数据存储在未对齐的地址上,CPU可能需要进行多次读取操作,从而降低性能。内存对齐规则规定,结构体中每个成员的偏移量必须是该成员大小的整数倍,结构体的总大小必须是其最大成员大小的整数倍。
实现方式
优化上述结构体,根据内存对齐规则重新排列成员顺序:
struct GameCharacterOptimized {
int id;
float health;
char gender;
};
在这个优化后的结构体中,int
和float
都是4字节,char
是1字节。id
的偏移量为0,health
的偏移量为4(是4的整数倍),gender
的偏移量为8(是1的整数倍)。结构体总大小为4 + 4 + 1 = 9字节,由于要满足最大成员(4字节)的整数倍,所以最终大小为12字节,相比于未优化的结构体,在存储大量角色信息时,能有效节省内存空间,同时也利用内存对齐提高了CPU访问效率,从而提升程序性能。