是这样滴,
sizeof(max)=20没有意见
sizeof(struct data)为什么会是32呢?
你可以试一下
struct data1{int cat;double dog;}
sizeof按最大字节对齐,答案是16,很好。
struct data1{int cat;int pig;double dog;}
sizeof按最大字节对齐,答案也是16,WHY。
因为按8字节对齐,int cat和int pig可以放在一起,也就是一个8字节里面。
struct data1{int cat;double dog;int pig;}
sizeof按最大字节对齐,答案是24,WHY……
因为按8字节对齐,int cat和int pig不可以放在一起……内存里面是:cat 空4字节…dog…pig 空4字节
如此,可以再回来看sizeof(struct data)
实际上是求sizeof(int cat; int k[5]; double dog;}),对吧?
按double 对齐,cat和k[0]可以放在一个double里面,
k[1]k[2]可以放在一个double里面,
k[3]k[4]可以放在一个double里面,
dog放在一个double里面,
所以一共4个double,也就是32……
所以,答案就是32+20=52……
我觉得…… 我讲得很清楚 …… 仔细看 ……很好理解的……
union是共享内存的.
long i; // 4
ing k[5]; // 20
char c; // 1
20个字节可以满足所有的定义,所以size(DATE)=20.
struct data中:
int cat;// 4
DATE cow; // 20
double dog; // 8
4+20+8就是32了,所以总的是52.
另外,你是不是表达错了??
"如果默认以最大字节对齐sizeof(DATE)应该是3*20=60 sizeof(data)=20总共是80"
你是不是想说:
"如果默认以最大字节对齐sizeof(struct data)应该是3*20=60 sizeof(DATE)=20总共是80" ??
最大字节对齐不是这么说的吧?
struct {
char c; // 1
short s; // 2
int i; // 4
};
看起来好像是7
char c <<=== 1
----
char c
short s <<=== 4 char c遇到short s,发生字节对齐
----
char c
short s
int i <<==== 8 因为前面已经是4,后面遇到int i为4,不需要字节对齐,所以最后为8
然后你会发现:
struct t1 {
int j;
char c;
short s;
int i;
};
和
struct t1 {
int j;
char c;
int i;
};
都是12,就是因为最大字节为4,char和short一起字节对齐为4.
好像所谓的最大字节对齐,不会大到20,最大只是4而已,这只是针对32位机,不知道64位机会不会变成8.
关于union的大小, 当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍。
举例如下:
下例表示声明一个共用体foo:
union foo{
int i; //4
char c;//1
double k;//8
};
以上例而言,最大长度是double数据类型,所以foo的内存空间就是double型的长度。
union foo
{
char s[10];
int i;
};
在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。
这完全是看你的pragma里面的设置是多少。
还有你的电脑是32位的还是64位的。
你直接记个结论也可以,那就是将占用的最大的东西放在前面定义。这样就会使得整个的size变小,因为空洞被缩小了。