内存中的数据对齐

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

 当结构体某一成员后面紧跟一个要求比较大的地址对齐成员时(例如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.youkuaiyun.com/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;
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值