C语言、C++内存对齐问题详解(3)
总结了那么多的规则,不来点实际的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;
};
- 上一篇:没有了
- 下一篇:C++实现查壳程序代码实例





