C的struct内存对齐的问题
2009-08-25 10:44
211 查看
采用VC6的的编译器
对于struct:
struct ST_DAT1
{
char cDatA;
int nDatC;
char cDatB;
} stDblChr;
struct ST_DAT2
{
char cDatA;
char cDatB;
int nDatC;
} stDblChr;
很显然,编译器在编译的时候,要做内存对齐的调整。由于两个struct中最长的变量都是int,占据了4个字节的内存空间,因此都会提升至int型。
对ST_DAT1,cDatA紧接着是int型的nDatC,因此cDatA会自动提升成int。其实这个地方是由于分配了cDatA之后,剩下的内存空间只有3个字节,不足以放下一个int型,要存储nDatC的时候,nDatC只有另起炉灶,放到一个新的4字节空间里面,因为cDatA自动提升成了int。最后的cDatB,其后面没有东西了,也会自动提升成int型。因此ST_DAT1占据了12个字节(用sizeof检查)
对ST_DAT2,cDatA,和cDatB两个写得相连,编译器,碰到cDatA,先分配一个字节给他,再碰到cDatB,由于和cDatA的数据宽度一样,因此不会做提升,同意分配一个字节他,此时总共分配了两个字节。等编译器碰到nDatC,由于数据位宽不一样,就要做自动提升了,和前面的道理一样。因此这个时候sizeof检查ST_DAT2占据了8个字节。
对于struct:
struct ST_DAT1
{
char cDatA;
int nDatC;
char cDatB;
} stDblChr;
struct ST_DAT2
{
char cDatA;
char cDatB;
int nDatC;
} stDblChr;
很显然,编译器在编译的时候,要做内存对齐的调整。由于两个struct中最长的变量都是int,占据了4个字节的内存空间,因此都会提升至int型。
对ST_DAT1,cDatA紧接着是int型的nDatC,因此cDatA会自动提升成int。其实这个地方是由于分配了cDatA之后,剩下的内存空间只有3个字节,不足以放下一个int型,要存储nDatC的时候,nDatC只有另起炉灶,放到一个新的4字节空间里面,因为cDatA自动提升成了int。最后的cDatB,其后面没有东西了,也会自动提升成int型。因此ST_DAT1占据了12个字节(用sizeof检查)
对ST_DAT2,cDatA,和cDatB两个写得相连,编译器,碰到cDatA,先分配一个字节给他,再碰到cDatB,由于和cDatA的数据宽度一样,因此不会做提升,同意分配一个字节他,此时总共分配了两个字节。等编译器碰到nDatC,由于数据位宽不一样,就要做自动提升了,和前面的道理一样。因此这个时候sizeof检查ST_DAT2占据了8个字节。
相关文章推荐
- struct/class等内存字节对齐问题详解
- 关于 struct 和 union 存储时内存边界对齐的问题(二)
- C++:struct和union 内存字节对齐问题
- 内存对齐-C语言struct内存占用问题
- C/C++中关于struct内存对齐问题
- C/C++中关于struct内存对齐问题
- Net的struct的内存对齐问题
- C的struct内存对齐的问题(二)
- 关于struct和union存储的内存字节对齐的问题
- 关于struct的内存对齐问题
- C/C++中关于struct内存对齐问题
- gcc 中结构体(struct)内存对齐问题分析
- struct/class等内存字节对齐问题详解
- struct成员的内存对齐问题:
- C# 使用 StructLayoutAttribute 时 C# /C++ 内存空间分配与成员对齐问题
- struct/class等内存字节对齐问题详解
- [C++] struct 内存对齐问题
- struct/class等内存字节对齐问题详解
- 关于struct和union存储的内存字节对齐的问题
- C++的struct类型的内存问题