龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C语言、C++内存对齐问题详解(4)

时间:2014-10-10 02:59来源:网络整理 作者:网络 点击:
分享到:
首先使用规则1,对成员变量进行对齐: x1 = 4,按照1进行对齐,x1占用0; x2 4,按照4进行对齐,x2占用4,5,6,7,8,9,10,11; x3 4,按照2进行对齐,x3占

首先使用规则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时,也是有讲解的。在以后的编码生涯时,是不是又要多考虑一些呢?纠结~

精彩图集

赞助商链接