您的位置:首页 > 编程语言 > C语言/C++

结构体字节对齐(vc++)

2011-11-07 14:55 281 查看
结构体字节对齐问题

1.引出问题

我们先来看两个小程序

#include <stdio.h>

struct fiber1

{

char p1;

short p2;

int p3;

}

struct fiber2

{

char p1;

int p3;

short p2;

}

main()

{

printf("the size of fiber1 is %d\n",sizeof(fiber1));

printf("the size of fiber2 is %d\n",sizeof(fiber2));

}

运行结构是:the size of fiber1 is 8

the size of fiber1 is 12

我们发现我们只是改变了变量在结构体的位置,但是运行结果却不一样。

2.原因

我们发现在vc++中,为结构体变量分配内存时与c语言不同。

其规则是:

在vc++中,为结构体变量分配内存时,先分配一个单位长度,然后在这个单位长度中依次为结构体内的变量分配空间,直到该单位长度空间不能变量分配一个完整的空间为止。再为变量分配一个单位空间。

类型 对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)

Char 偏移量必须为sizeof(char)即1的倍数

Short 偏移量必须为sizeof(short)即2的倍数

int 偏移量必须为sizeof(int)即4的倍数

float 偏移量必须为sizeof(float)即4的倍数

double  偏移量必须为sizeof(double)即8的倍数

各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对

齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边

界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员

变量申请空间后,还会根据需要自动填充空缺的字节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: