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

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

时间:2014-10-10 02:59来源:网络整理 作者:网络 点击:
分享到:
总结了那么多的规则,不来点实际的code,总觉的少点什么,好吧。以下就按照上述总结的内存对齐规则,来进行一些实际的代码分析(注:测试环境Wind

总结了那么多的规则,不来点实际的code,总觉的少点什么,好吧。以下就按照上述总结的内存对齐规则,来进行一些实际的代码分析(注:测试环境Windows 8.1 + Visual Studio 2012 update 3)。

测试代码如下,先确认测试环境:

复制代码 代码如下:

#include <iostream>
using namespace std;
 
struct Test
{
     char x1;
     double x2;
     short x3;
     float x4;
     char x5;
};
 
int main()
{
     cout<<"sizeof(char)"<<sizeof(char)<<endl;          // 1byte
     cout<<"sizeof(short)"<<sizeof(short)<<endl;        // 2bytes
     cout<<"sizeof(int)"<<sizeof(int)<<endl;            // 4bytes
     cout<<"sizeof(double)"<<sizeof(double)<<endl;      // 8bytes
     return 0;
}

我分别设置#pragma pack(k),k=1,2,4,8,16进行测试。

复制代码 代码如下:

#pragma pack(1) // 设定对齐系数为1
struct Test
{
     char x1;
     double x2;
     short x3;
     float x4;
     char x5;
};

首先使用规则1,对成员变量进行对齐:
x1 <= 1,按照1进行对齐,x1占用0;
x2 > 1,按照1进行对齐,x2占用1,2,3,4,5,6,7,8;
x3 > 1,按照1进行对齐,x3占用9,10;
x4 > 1,按照1进行对齐,x4占用11,12,13,14;
x5 > 1,按照1进行对齐,x5占用15;
最后使用规则2,对struct整体进行对齐:
x2占用内存最大,为8bytes,8bytes > 1byte,所以整体按照1进行对齐;16%1=0。
所以,在#pragma pack(1) 的情况下,struct Test占用内存为16bytes;内存占用如下图所示:

复制代码 代码如下:

#pragma pack(2) // 设定对齐系数为2
struct Test
{
     char x1;
     double x2;
     short x3;
     float x4;
     char x5;
};

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

复制代码 代码如下:

#pragma pack(4) // 设定对齐系数为4
struct Test
{
     char x1;
     double x2;
     short x3;
     float x4;
     char x5;
};

精彩图集

赞助商链接