您的位置:首页 > 其它

内存中的数据对齐

2014-03-20 16:15 239 查看
数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。

 当结构体某一成员后面紧跟一个要求比较大的地址对齐成员时(例如char成员变量后面跟一个double成员变量),或是在,这时要插入一些没有实际意义的填充(Padding)。而且总的结构体大小必须为最大对齐的倍数。

char(1字节),1字节对齐
short(2字节),2字节对齐
int(4字节),4字节对齐
float(4字节),4字节对齐
double(8字节),Windows系统中8字节对齐,Linux系统中4字节对齐
      当结构体某一成员后面紧跟一个要求比较大的地址对齐成员时(例如char成员变量后面跟一个double成员变量),或是在,这时要插入一些没有实际意义的填充(Padding)。而且总的结构体大小必须为最大对齐的倍数。
下面是一个有char,int,short三种类型,4个成员组成的结构体,该结构体在还未编译之前是大小占8个字节。
struct AlignData

{

    char a;

    short b;

    int c;

    char d;

};

编译之后,为了保持结构体中的每个成员都是按照各自的对齐,编译器会在一些成员之间插入一些padding,因此编译后得到如下的结构体:

struct AlignData

{

    char a;

char Padding0[1];

short b;

    int c; 

    char d;

    char Padding1[3];

};

编译后该结构体的大小为12个字节,最后一个成员d后面填充的字节数要使该结构体的总大小是其成员类型中拥有最大字节数的倍数(int拥有最大字节数),因此d后面要填充3个字节。

下面举一些结构体例子来说明结构体的填充方式:

例子1:

struct struct1

{

    char a1;

    char b1;

};

结构体struct1的大小为2字节,因为char在结构体中的默认对齐是1,因此在a1和b1之间没有数据填充,而且其成员中占用字节最大的类型为char,因此结构体结束处和b1之间也没有数据填充。

例子2:

struct struct2

{

    char a2;

    short b2;

};

结构体struct2的大小为4字节,b2的是按2字节对齐,因此在b2于a2之间填充一个字节,而其成员中占用字节最大的类型为short,因此该结构体结束处和b2之间没有任何数据填充。

例子3:

Struct struct3

{

double a3;

char b3;

}

结构体struct3的大小为16字节,因为b3是按1字节对齐,所以b3与a3之间没有数据填充,而其成员中占用字节最大的类型为double,在Windows平台下是8字节对齐,因此该结构体结束处和b3之间有7个字节的数据填充。

参考地址:http://blog.csdn.net/donkeylong/article/details/4909720
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>

struct st1
{
int i;
char c;
int j;
}A;

struct st2
{
char c1;
int m;
char c2;
}B;

struct st3
{
char c3;
char c4;
int n;
}C;

struct st4
{
short x;
struct st5
{
char c5;
int y;
}D;
int z;
}E;

struct st6
{
char c6;
int p;
}F;

int _tmain(int argc, _TCHAR* argv[])
{
printf("the A in fit in %d\n",sizeof(A));
printf("the B in fit in %d\n",sizeof(B));
printf("the C in fit in %d\n",sizeof(C));
printf("the E in fit in %d\n",sizeof(E));
printf("the F in fit in %d\n",sizeof(F));
getchar();
return 0;
}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息