关于结构体大小疑点

关于结构体大小问题
初学者的一个问题啦
#include   <iostream>
using   namespace   std;

struct   data
{
int   a;
char   b[10];
double   c;
};
void   main()
{
cout < <sizeof(data);
}
单个测int=4,char[10]=10,double[8]
总和=22
为什么上面代码输出24呀

------解决方案--------------------
#pragma pack(push, 1)
struct data
{
int a;
char b[10];
double c;
};
#pragma pack(pop)
这样强制1字节对齐,就返回22了

字节对齐问题,32位的系统为了效率一般会默认4字节对齐
------解决方案--------------------
VC中结构体数据成员的对齐问题
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的
对齐方式调整位置,空缺的字节VC会自动填充.同时VC为了确保结构的大小为结构
的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在
为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字.
struct MyStruct { double dda1; char dda; int type };
为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一
个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为
sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节.接下来为第二
个成员dda分配空间,下一个可以分配的地址对于结构的起始地址的偏移量为8,是
sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变
量占用sizeof(char)=1个字节.接下来为第三个成员type分配空间,这时下一个可
以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了
满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东
西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof
(int)=4的倍数,所以把type存放在偏移量为12的地方,该变量占用sizeof(int)=4
个字节.这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:
8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字
节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充.所以整个结构的大
小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何
有意义的东西.
静态数据成员是存放在静态区共有的,不算在结构体中.
没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存
中都有唯一的地址。
sizeof(func( "1234 "))=4//func的返回类型为int,所以相当于//求sizeof(int)