结构体字节对齐(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为了确保结构的大小为结构的字节边
界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员
变量申请空间后,还会根据需要自动填充空缺的字节。
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为了确保结构的大小为结构的字节边
界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员
变量申请空间后,还会根据需要自动填充空缺的字节。
相关文章推荐
- VC中结构体内存分配问题透析(“字节对齐”访问数据)
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体字节对齐和位域对齐——VC、gcc
- VC和gcc下的结构体字节对齐和位域对齐
- 字节对齐 结构体的sizeof
- 关于结构体的长度问题(字节对齐)
- 结构体字节对齐
- C 结构体字节对齐规则
- sizeof - 指针,数组,变量,结构体字节对齐-计算
- 关于结构体字节对齐的问题
- 结构体字节对齐,pragma pack,__attribute__(packed)
- (c/c++学习笔记三) 结构体与联合体的字节对齐
- 字节对齐和结构体的大小运算
- 关于C语言中结构体字节对齐问题
- C语言结构体的字节对齐原则
- 结构体字节对齐
- 详解结构体、类等内存字节对齐
- struct结构体和union联合体:字节对齐下的sizeof返回