C语言、C++内存对齐问题详解(4)
首先使用规则1,对成员变量进行对齐:
x1 <= 4,按照1进行对齐,x1占用0;
x2 > 4,按照4进行对齐,x2占用4,5,6,7,8,9,10,11;
x3 < 4,按照2进行对齐,x3占用12,13;
x4 >= 4,按照4进行对齐,x4占用16,17,18,19;
x5 < 4,按照1进行对齐,x5占用20;
最后使用规则2,对struct整体进行对齐:
x2占用内存最大,为8bytes,8bytes > 4byte,所以整体按照4进行对齐;21%4!=0
所以,在#pragma pack(4) 的情况下,struct Test占用内存为24bytes;内存占用如下图所示:

#pragma pack(8) // 设定对齐系数为8
struct Test
{
char x1;
double x2;
short x3;
float x4;
char x5;
};
首先使用规则1,对成员变量进行对齐:
x1 <= 8,按照1进行对齐,x1占用0;
x2 >= 8,按照8进行对齐,x2占用8,9,10,11,12,13,14,15;
x3 < 8,按照2进行对齐,x3占用16,17;
x4 <= 8,按照4进行对齐,x4占用20,21,22,23;
x5 < 8,按照1进行对齐,x5占用24;
最后使用规则2,对struct整体进行对齐:
x2占用内存最大,为8bytes,8bytes >= 8byte,所以整体按照8进行对齐;25%8!=0
所以,在#pragma pack(8) 的情况下,struct Test占用内存为32bytes;内存占用如下图所示:

#pragma pack(16) // 设定对齐系数为16
struct Test
{
char x1;
double x2;
short x3;
float x4;
char x5;
};
首先使用规则1,对成员变量进行对齐:
x1 < 16,按照1进行对齐,x1占用0;
x2 < 16,按照8进行对齐,x2占用8,9,10,11,12,13,14,15;
x3 < 16,按照2进行对齐,x3占用16,17;
x4 < 16,按照4进行对齐,x4占用20,21,22,23;
x5 < 16,按照1进行对齐,x5占用24;
最后使用规则2,对struct整体进行对齐:
x2占用内存最大,为8bytes,16bytes >= 8byte,所以整体按照8进行对齐;25%8!=0
所以,在#pragma pack(16) 的情况下,struct Test占用内存为32bytes;内存占用如下图所示:

总结
经过上面的实例分析,我对内存对齐有了全面的认识和了解。现在再回过来看看文章开头的那段代码,问题就迎刃而解了,同时经过这段代码,让我们认识到定义struct或者union时,也是有讲解的。在以后的编码生涯时,是不是又要多考虑一些呢?纠结~
- 上一篇:没有了
- 下一篇:C++实现查壳程序代码实例





