话说大家有没有发现结构体中的内存对齐问题很有意思呢?我们这一次就一起研究一下这个问题为什么值得人探讨。
结构体内存对齐有三个原则;
1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
struct A
{
int a; 4 8 4 4
char c; 1 8 1 1
char d; 1 6 1 1
};
根据第三条,结构体的大小为8;
struct B
{
char c; 1 8 1 1个其余三个补齐 4
int a; 4 8 4 4
char d; 1 8 1 1个其余三个补齐 4
};
结构体大小为12;
struct c
{
int a; 4 8 4 4
char c; 1 8 1 1个其余三个补齐 4
double d; 8 8 8 8
};
结构体大小为16;
struct d
{
int a; 4 8 4 4个其余四个补齐 8
double b; 8 8 8 8
char c; 1 8 1 1个其余7个补齐 8
} ;
结构体大小为24;
最后我们应该知道几点:
为什么要设计内存对齐的处理方式呢?
如果体系结构是不对齐的,成员将会一个挨一个存储,显然对齐更浪费了空间。
那么为什么要使用对齐呢?
体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。
在设计结构体的时候,一般会尊照一个习惯,就是把占用空间小的类型排在前面,占用空间大的类型排在后面,这样可以相对节约一些对齐空间。
原文地址:http://blog.csdn.net/liuxiaoqian_/article/details/45776251