内存对齐(结构体)
程序员文章站
2024-03-23 10:14:34
...
结构体的内存对齐总结:
1、每一个成员所占字节数必须是前面所有成员所占内存数的公约数,如果不是,则要加上所缺的字节数。
2、为了使结构体指针使用时可以达到和结构体一样的快速摘取成员的效果,要求:当最后一个成员已经满足1中的条件时,还要比较最后成员所占字节数是否是所有成员中最大的一个,如果不是,则最后成员所占字节数为最大成员所占字节数。
3、总结:为了节约空间,在定义结构体成员时,最好将小字节数的成员定义在前面,大的放在后面。
举例如下:
struct A
{
char a;//1字节
int b;//4字节,1不是4的倍数,而1+3是,所以加1后面加3个无效字节。而4字节是最多的字节数,不用补充
};//4+4=8字节,
struct B
{
char a;//1字节
short b;//2字节,同上,1+1=2,
int c;//4字节,而2+2=4字节,是4的倍数,而且4字节为最多,不用补充
};//4+4=8字节
struct C
{
short a;//2字节
char b;//1字节,2是1的倍数,不用补充
int c;//4字节,2+1=3,不是4的倍数,补充1,4为最大,同上
};//4+4=8字节
struct D
{
char a;//1字节
short b;//2字节,1+1=2
char c;//1字节,满足
int d;//4,2+2+1+3=4的倍数,同上
};//2+2+1+3+4=12
struct E
{
char a;//1
char x;//1
short b;//2,1+1=2
int c;//4,1+1+2=4,同上
};//4+4=8;
struct F
{
char a;//1
int b;//4=1+3
short c;//2,满足(1),然而4>2,所以最后要加2
};//4+4+2+2=12
struct I
{
int a;//4
struct II
{
char b;//1
int c;//4=1+3
}d;//4+4=8
};//4+8=12
struct J
{
int a;//4
double b;//8=4+4
};//8+8=16
下一篇: 如何快速写一个 Http Client