结构体内存对齐是很重要的一个考点,但不难掌握,接下来就来了解一下结构体内存对齐
首先来看一下对齐规则
看完可能会有疑惑,什么是偏移量?
表示指定成员与其结构开头之间的字节数。
offsetof是求偏移量的大小
例如:
struct S1
{
char c1;//y有效对齐数为1
char c2;//有效对齐数w为1
int i;//有效对齐数为4
};
总大小为8字节
2.
struct S2
{
char c1;//有效对齐数为1
struct S1 s2;//有效对齐数为4(对齐到自己的最大对齐数的整数倍处)
double d;//有效对齐数为8
};
c1放在偏移量0处,占1个字节
s2放在偏移量4处,占8字节
d放在偏移量16处,占8字节
总大小为24字节
总体来说:
结构体的内存对齐是拿空间来换取时间的做法
那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:
让占用空间小的成员尽量集中在一起。
//例如:
struct S1
{
char c1;
int i;
char c2;
};//12 Byte
struct S2
{
char c1;
char c2;
int i;
};//8 Byte
S1和S2类型的成员一模一样,但是S1和S2所占空间的大小有了一些区别。
欢迎纠错与讨论